背景
通过官方文档学习
quickstart
第一个app
代码
文件命名为hello.py
windows执行set FLASK_APP=hello,linux执行export FLASK_APP=hello,然后执行flask run即可运行app
默认运行的app是127.0.0.1:5000,可通过-h -p参数改ip地址和端口。其中,127.0.0.1只能本电脑访问,如果希望其他局域网也可访问,可将host设为0.0.0.0。如果在linux,需要放通对应的端口才能访问:iptables -A INPUT -p tcp --dport 8089 -j ACCEPT; iptables -A INPUT -p udp --dport 8089 -j ACCEPT;
部署时如果是测试环境会有提示,页面也会显示详细报错,可通过环境变量FLASK_ENV设置
http转译
将用户提供的所有值转化为转义字符,防止注入攻击
from markupsafe import escape
@app.route("<name>")
def hello_world(name):
return f"hello, {escape(name)}"
<name>可捕获url的参数作为变量传给url处理函数
路由
使用app的方法.route来进行路由,如@app.route("<test_var>")
一个url处理函数可有多个route装饰,即一个url处理函数,匹配多个url
路由变量类型
可以对路由捕获的参数进行类型限定,如@app.route("<int:test_var>")
关于url末尾的斜杠
resource是文件夹名这种时,可以在url后加个/,当访问没加/,也会重定向到对应url
resource是文件时,url后一般不加/,此时如果访问时加了/,会报错,这防止了对resource重复进行重定向
url_for函数
该函数可用于建立url,用于将所有url汇总并做些自己的处理,但每个url都需要调用一次,函数传入第一个参数是route函数名,返回对应的url,后面可跟任意多关键字参数
可通过该函数,新建某个url,指向已有的url处理函数
请求方法
可通过@app.route("/test", methods=['GET', 'POST'])指定url允许的请求方法,如果不带method参数,默认只支持get方法,但如果显式规定了GET方法,也会自动支持HEAD和OPTIONS方法
静态文件
当需要js,css等文件,可通过静态文件部署
可通过执行url_for('static', filename='test.css')实现静态文件对应的访问endpoint,在这之前需要先在目录下手动创建static文件夹,filename对应的文件应该也放在目录下
from flask import Flask
from flask import url_for
app = Flask(__name__)
@app.route("/hello")
def hello_world():
return "<p>hello world</p>"
with app.test_request_context():
url_for('static', filename='test.css')
模板渲染
可通过render_template函数渲染,需要提供模板名,模板需要放在项目的templates目录下
{% if name %}
<p>hello, {{ name }}</p>
{% else %}
<p>hello, world</p>
{% endif %}
from flask import Flask
from flask import url_for, render_template
app = Flask(__name__)
@app.route("/hello/<name>")
def hello_world(name):
return render_template("test.html", name=name)
#return "<p>hello world</p>"
with app.test_request_context():
url_for('static', filename='test.css')
访问请求数据
可通过访问request对象对请求数据进行访问
request.form 表单数据
request.method 请求方法
request.args.get('key_name', '') 访问url里的参数,如果get报错会,服务器最终会返回400
文件上传
上传文件时不要忘了enctype="multipart/form-data"就行,否则浏览器不会上传你的文件
可执行request.files访问文件,文件对象和python内置file对象差不多,多了个save方法
可执行request.files['filename'].filename获取文件原始文件名,一般不可以新人原始文件名,如果要信任,需要使用secure_filename函数处理