一、url_for
- 1.作用
- 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
- url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮我们搞定。
- 2.传参数
url_for中传递参数是查询字符串,用来指定资源。查询字符串从问号?开始,以键值对的形式写出,多个键值对之间使用&分隔。
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/active/')
def active():
return url_for('active', name='superman', age=34, heght=191)
if __name__ = '__main__':
app.run(debug=True)
- 3.url结尾带'/'
@app.route('/root/')
和@app.route('/root')
是两个不同的url。不带'/'的url在地址结尾输入'/'时会直接报错,带'/'的url在地址结尾输不输'/'都会自动识别为带'/'。
二、定制http的请求方法
Http协议是万维网中数据通信的基础。在该协议中定义了从指定URL检索数据的不同方法。
不同的http方法:
序号 | 方法与描述 |
---|---|
1 | GET以未加密的形式将数据发送到服务器。最常见的方法。 |
2 | HEAD和GET方法相同,但没有响应体。 |
3 | POST用于将HTML表单数据发送到服务器。POST方法接收的数据不由服务器缓存。 |
4 | PUT用上传的内容替换目标资源的所有当前表示。 |
5 | DELETE删除由URL给出的目标资源的所有当前表示。 |
-
- POST
默认情况下,Flask路由响应GET请求。但是,可以通过为route()装饰器提供方法参数来更改此首选项。
为了演示在URL路由中使用POST方法,首先让我们创建一个HTML表单,并使用POST方法将表单数据发送到URL。
将以下脚本另存为login.html
- POST
现在在Python shell中输入以下脚本:
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/success/')
def success(name):
return 'welcome %s' % name
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['nm']
return redirect(url_for('success',name = user))
else:
user = request.args.get('nm')
return redirect(url_for('success',name = user))
if __name__ == '__main__':
app.run(debug = True)
开始运行后,在浏览器中打开login.html,在文本字段中输入name,然后单击提交。表单数据将POST到表单标签的action子句中的URL。http://localhost/login映射到login()函数。由于服务器通过POST方法接收数据,因此通过以下步骤获得从表单数据获得的“nm”参数的值:
user = request.form['nm']
它作为变量部分传递给'/ success' URL。浏览器在窗口中显示welcome消息。
- 2.GET
在login.html中将方法参数更改为'GET',然后在浏览器中再次打开它。服务器上接收的数据是通过GET方法获得的。通过以下的步骤获得'nm'参数的值:User = request.args.get(‘nm’)
这里,args是包含表单参数对及其对应值对的列表的字典对象。与'nm'参数对应的值将像之前一样传递到'/ success' URL。
三、网页跳转和重定向
重定向分为暂时性重定向和永久性重定向,也就是在浏览器上会自动跳转到另一个页面。
- 1.永久性重定向: http 的状态码是 301 ,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,输入 www.jingdong.com 的时候,会被重定向到 www.jd.com。
- 2.暂时性重定向:http 的状态码是 302 ,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
- 3.Flask中的重定向
重定向是通过 redirect(location,code=302) 这个函数来实现的。location 表示需要重定向到的 URL,应该配合之前讲的 url_for()函数来使用。code 表示采用哪个重定向,默认是 302( 暂时性重定向 ) ,可以修改成 301来实现永久性重定向。
from flask import Flask,request,url_for,redirect
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
# 登录界面
@app.route('/login/')
def login():
return '请登录'
# 页面跳转,暂时性重定向302 永久性重定向301
@app.route('/profile/')
def profile():
if request.args.get('name'):
return '用户中心页面'
else:
return redirect(url_for('login'),code=302)
if __name__ == '__main__':
app.run()
四、关于Response响应
视图函数的返回值
- 1.字符串。
return '字符串'
- 2.元祖。
return '字符串', '状态码'
- 3.字典。
return 字典
- 4.Response。
return Response('字符串', '状态码', mimetype = 'text/plain')
- 5.make_response。
return make_response('字符串')
五、flask模板介绍
使用render_template方法可以轻松调用模板,需要传入两个参数,模板名称和模板使用的数据对象。使用之前需要导入render_template方法:
from flask import Flask,url_for,render_template
模板文件需要存放在flask程序文件所在目录的上级目录下的templates文件夹下,flask才能获取该模板文件。
比如我们在templates文件夹下新建一个hello.html的模板,复制如下代码。
Hello from Flask
{% if name %}
Hello {{ name }}!
{% else %}
Hello World!
{% endif %}
在使用如下代码调用模板。
@app.route("/tmpl")
def renderTmpl():
return render_template("hello.html",name="Hello Tmpl")
六、flask模板传参
- 1.以关键字参数的形式传
@app.route('/')
def index():
return render_template('/index.html', name='zhangsan')
页面模板中使用{{ }}接收,{{ }}表示包裹的是一些数据变量,上面方法对应的接收方式为:
- 2.我们通常会传递一组数据,例如我们传递一个字典。
@app.route('/')
def index():
context = {
username = 'tom',
age = 32,
skill = {1:'python', 2:'html', 3:'ccs'}
}
return render_template('/index.html', context=context)
上面方法对应的接收方式为:
- 3.常用的传递参数方法。用解包的方式传参。
@app.route('/')
defindex():
context={
username = 'tom',
age = 32,
skill = {1:'python', 2:'html', 3:'ccs'}
}
returnrender_template('/index.html', **context)
上面方法对应的接收方式为:
{{ username }}
{{ skill.1 }}