url和视图
文章目录
一、url与函数的映射
1.1 @app.route()
route是一个视图函数,通过该装饰器装饰的函数,可以将括号后的url映射到装饰的函数,使url和函数产生关系。当访问该url时,可以得到函数结果。
1.2 约束类型
@app.route('/xxx/<约束类型:xxx>')
尖括号是一个固定写法,里面是一个参数,可以进行传递
约束类型有:
- int:整型
- float:浮点型
- string:字符串,但不包括‘/’
- path:和string类似,但可以包括‘/’
- uuid:uuid类型的字符串(c3e410f0-ac2c-11e8-946c-847beb34fd3d)
- any:可以指定多种路径
url通过 ‘/’ 作为分隔符,但如果不想定制子路径,可以用 ?= 的方式来传递参数,如:/xxx/?id=xxx,可以通过request.args.get(id)来获取id的值
from flask import Flask,request
import config
app = Flask(__name__)
@app.route('/')
def hello_python():
return 'Hello, Python!'
@app.route('/why/<content>')
def love_python(content):
return '人生苦短,我爱{}'.format(content)
@app.route('/example1/<int:number>')
def any_int(number):
return '这可以是任意整数:{}'.format(number)
@app.route('/example2/<float:float_number>')
def any_float(float_number):
return '这可以是任意浮点数:{}'.format(float_number)
@app.route('/example3/<string:month>')
def notany_string(month):
return "这可以是字符串:{},但不能是'/'".format(month)
@app.route('/example4/<path:road>')
def any_road(road):
return "这可以是任意字符串:{},包括'/',该约束类型慎用".format(road)
@app.route('/example5/<any(list,dict,set):url_path>')
def url_path(url_path):
return '这可以访问不同的路径:当前路径:{}'.format(url_path)
@app.route('/example6/<uuid:uuid_string>')
def uuid_string(uuid_string):
return '这可以返回uuid类型的字符c3e410f0-ac2c-11e8-946c-847beb34fd3d串:{}'.format(uuid_string)
# uuid类型的字符串:
@app.route('/build_url')
def self_route():
return request.args.get('name')
if __name__ == '__main__':
app.config.from_pyfile('config.py')
app.run()
二、构造url
2.1 url_for
url_for(‘函数名称’,参数1,参数2)
url_for的作用是可以获取与函数有映射关系的url,url_for会接收函数名称作为第一个参数,如果后面还有参数,会进行拼接并接在获取的url后面
from flask import Flask,url_for
import config
app = Flask(__name__)
@app.route('/fn1')
def fn1():
return 'fn1'
@app.route('/fn2')
def fn2():
return url_for('fn1',a=1,b=2,c=3)
# url_for(函数名称,参数1,参数2),url_for会接收第一个参数作为函数名称,获取与该函数有映射关系的url,如果后面还带有参数,则后面的参数会议拼接的方式接在获取的url后面
if __name__ == '__main__':
app.config.from_pyfile('config.py')
app.run()
2.2 指定url后面的斜杠(’/’)
注意:url在后面加了斜杠和没加斜杠是两个url
加了斜杠如果在访问时没有加斜杠,会被重定向到后面加了斜杠的url;但如果本来没有加,在访问时如果加了,就会报错
@app.route('/fn1')
def fn1():
return 'fn1'
@app.route('/fn1/')
def fn2():
return 'fn2'
2.2 指定HTTP的方法
在@app.route()可以指定一个参数为methods,里面可以指定http访问的方法,常用的有GET,POST等。
from flask import Flask,request
app = Flask(__name__)
@app.route('/')
def HomePage():
return 'Welcome to my HomePage'
# GET方法,将参数拼接在url后面
# POST方法,将参数都保存在一个form表单里
@app.route('/fn2',methods=['GET','POST'])
def fn2():
print('POST请求成功')
return request.form.get('name')
if __name__ == '__main__':
app.config.from_pyfile('config.py')
app.run()
2.3 重定向
如果在未登录状态下想要访问淘宝的商品信息,当你点击商品信息时,页面不会跳转到该商品信息,而是跳转到登陆页面。类似这种的现象就叫重定向。即访问的网页会跳转到别的网页
重定向有临时重定向和永久重定向
临时重定向就类似淘宝在未登录状态下点击商品时会跳转到登陆页面。
永久重定向的一个典型例子就是京东,京东的旧网址是:jindong.com,新网址是:jd.com;但可能还会有人习惯通过访问jindong.com这个旧网址进入京东,这时候就需要设置永久重定向让旧网址永远都会跳转到新网址。
在flask中,用redirect方法来设置重定向:
redirect('url',code=302)
url可以通过url_for()方法来获取,code是指定重定向类型的编码
默认为302(临时重定向),永久重定向为301
from flask import Flask,redirect,url_for,Response
import config
app = Flask(__name__)
@app.route('/', methods=['GET','POST'])
def HomePage():
return 'Welcome to my HomePage'
@app.route('/just_surf', methods=['GET','POST'])
def surf():
return 'you are surfing, if you want to buy, please log in'
@app.route('/buy', methods=['GET','POST'])
def buy():
return redirect(url_for('surf')) # the name of the function(函数名,而不是函数对象,所以加引号)
# return redirect(url_for('surf'),code=301)永久重定向 code默认为302(临时重定向)
if __name__ == '__main__':
app.config.from_pyfile('config.py')
app.run()
2.4 Response响应
视图函数可以返回如下类型的值:(列表类型返回会报错)
- 字符串(String)
- 元组:元组返回的一般是(字符串,状态码)
- 字典
- Response类型
创建Response对象
2.4.1 Response()
通过Response()方法创建Response对象
Response(response='页面显示信息',status=状态码,context_type='text/html')
2.4.2 make_response()
通过make_response()方法创建Response对象
make_response('字符串')
from flask import Flask,Response,make_response
import config
app = Flask(__name__)
@app.route('/', methods=['GET','POST'])
def HomePage():
# return 'Welcome to my HomePage' # 字符串
# return {1:2,2:3,3:4} # 字典
# return 'not found',404 # 元组(字符串,状态码)
return Response(response='homepage', status=200, content_type='text/html; charest=utf-8')
# (字符串,状态码,)
return make_response('homepage')
if __name__ == '__main__':
app.config.from_pyfile('config.py')
app.run()