在FLASK中,url要与函数映射,需要使用route()装饰器将二者绑定。
调用app.route()装饰器并指定url(’/’):
@app.route('/')
def hello_world():
return 'Hello World!'
在浏览器中输入127.0.0.1:5000/(127.0.0.1为默认ip,5000为默认端口)
指定url /index
@app.route('/index')
def index():
return '这里是index'
# test1
@app.route('/test1')
def test1():
return '这里是test1'
# test2
@app.route('/test2/')
def test2():
return '这里是test2'
对于test1,url尾部没有/,在访问时尾部添加斜杠即’/test1/’,会报404错误,前端显示Not Found。
而对于test2,若未在其尾部添加斜杠即’/test2’,Flask会自动进行重定向,在尾部自动添加/,即’/test2/’。
test1与test2的区别类似与文件与文件夹,test1可以保持url唯一,建议在定义路由时候在末尾加上’/'即test2的写法,可以避免访问错误。
使用<>可以在url添加变量,作为关键字参数传给对应函数,默认的变量为string类型即字符串,若要使用其他类型,则需要用<类型:变量名>的方式来定义。
@app.route('/variate1//' )
def variate1(v1):
print('v1的类型为',type(v1))
print('v1为',v1)
return '这是v :%s'%(v1)
@app.route('/variate2//' )
def variate2(v2):
print('v2的类型为',type(v2))
print('v2为',v2)
return '这是v :%s'%(v2)
传入一个path类型的参数
@app.route('/variate3//' )
def variate3(v3):
print('v3的类型为',type(v3))
print('v3为',v3)
return '这是v :%s'%(v3)
变量类型
类型 | 注释 |
---|---|
string | 默认值,不接受有/的文本 |
int | 整数类型 |
float | 正浮点类型 |
path | 类似于string,可以有/ |
uuid | 接受uuid字符串 |
flask默认路由只回应GET请求,可以通过methods参数来设置可回应的请求类型,此时可以导入request方法来判断请求类型。
from flask import request
@app.route('/request',methods=['POST','GET'])
def requ():
return request.method
通过查询字符串形式所传的参数可以通过request方法来获取
from flask import request
@app.route('/req',methods=['POST','GET'])
def req():
if request.method == 'GET':
res = request.args.get('id')+'get'
elif request.method == 'POST':
res = request.form.get('id')+'post'
return res
url可以映射到函数中,知道函数名,可以通过url_for()来获对应的url(url_for官网详解),url_for()可以传入任意个关键字参数,即使函数中没有对应形参。
from flask import url_for
@app.route('/test1')
def test1():
return '这里是test1'
@app.route('/variate1//' )
def variate1(v1):
print('v1的类型为',type(v1))
print('v1为',v1)
return '这是v :%s'%(v1)
# 启动时
with app.test_request_context():
print(url_for('test1'))
print(url_for('variate1',v1=2))
print(url_for('variate1', v1=2,id=2))
print(url_for('variate1', v1=2, id=2,p='l'))
print(url_for('variate1', v1=2, id='/l'))
在我们访问页面时经常遇到未登录时,会自动跳转到登录页面,这就存在一个重定向行为即浏览器从一个页面跳转到另一个页面。
常用重定向方式有:
flask通过redirect()来实现url的重定向。这里使用url_for()来获取url,避免url更改可能产生的错误。
from flask import request
from flask import url_for
from flask import redirect
@app.route('/login/')
def login():
return '这里是登录'
@app.route('/commit/')
def commit():
name = request.args.get('name')
return name if name else redirect(url_for('login'),code=302)
可以看到输入url时为带name,会重定向到login,状态码为302。在地址栏输入http://127.0.0.1:5000/commit/?name=Tom则会正常进入commit页面,状态码为200
函数return的类型可以是string、tuple、dict、Response。
string、Response
#string
@app.route('/retstring/')
def ret_string():
return '这是一个string'
#Response
@app.route('/retresponse/')
def ret_response():
return Response('这是一个Response')
这里可以看到通过string返回和通过Response返回在前端所展示的格式一直,是由于返回的是string类型时,flask会根据这个string和缺省对象生成一个Response再返回,本质返回的还是Response。
tuple
tuple返回的格式为 (response, status) 、 (response, headers) 或者 (response, status, headers),response为响应内容,status为状态码,headers 是一个由额外头部值组成的列表 或字典
# tuple
@app.route('/rettuple/')
def ret_tuple():
return '这里是返回的tuple',201,{
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11'}
可以看到rettuple的状态码、User-Agent均变成所设置的。
dict
@app.route('/retdict/')
def ret_dict():
return {
1:'Tom',2:'Kitty'}
jsonify()
如果要返回其他类型的数据如list,通过return直接返回会报错,此时可以通过josnify()函数将list转成josn格式再返回。
# 直接返回list
@app.route('/retjson/')
def ret_json():
return [1,2,3,4,5]
# list转换成josn再返回
from flask import jsonify
@app.route('/retjson/')
def ret_json():
return jsonify([1,2,3,4,5])