url与函数的映射
URL与视图
URL与函数的映射
从之前的helloworld.py文件中,我们已经看到,一个URL要与执行函数进行映射,使用的是@app.route装饰器。@app.route装饰器中,可以指定URL的规则来进行更加详细的映射,比如现在要映射一个文章详情的URL,文章详情的URL是/article/id/,id有可能为1、2、3...,那么可以通过以下方式
@app.route('/article/<id>/')
def article(id):
return '%s article detail' % id
其中,尖括号是固定写法,语法为,variable默认的数据类型是字符串。如果需要指定类型,则要写成converter:variable,其中converter就是类型名称,可以有以下几种 • string: 默认的数据类型,接受没有任何斜杠/的字符串。 • int: 整形 • float: 浮点型。 • path: 和string类似,但是可以传递斜杠/。 • uuid: uuid类型的字符串。 • any:可以指定多种路径
@app.route('/<any(article,blog):url_path>/')
def item(url_path):
return url_path
####构造URL(url_for) 一般我们通过一个URL就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL呢?url_for函数就可以帮我们实现这个功能。url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。 通过构建URL的方式而选择直接在代码中拼URL的原因有两点 1. 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。 2. url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮我们搞定
####以下是实例 注意:以下是社区版debug模式,专业版改host,port以及开关debug都需要去右上角编辑配置开启
from flask import Flask
from flask import request
# import config
app = Flask(__name__)
@app.route('/')
def hello_world():
# a=1
# b=0
# c = a/b
return 'Hello World!'
@app.route('/Leo')
def hello_leo():
return '第一个flask界面'
#接收没有任何斜杆的字符串
@app.route("/list/<aid>")
def hello_list(aid):
return '这是第{}篇文章'.format(aid)
@app.route("/listi/<int:intid>")
def hello_intlist(intid):
return '这是第{}篇文章'.format(intid)
#string (缺省值) 接受任何不包含斜杠的文本 除特殊符号与/外都可以
@app.route("/lists/<string:said>")
def hello_stringlist(said):
return '这是第{}篇文章'.format(said)
#path 类似 string ,但可以包含斜杠
@app.route("/list/<path:aid>")
def hello_pathlist(aid):
return "detail-第{}篇文章".format(aid)
#article blog 注意这里尾部要有斜杠
@app.route("/<any(article,blog):url_path>/")
def item(url_path):
return url_path
@app.route("/wd")
def baidu():
return request.args.get("name")
if __name__ == '__main__':
#以下为社区版开启debug模式
# app.debug = True
# app.bug = True
#config
#app.config.update() 字典合并
app.config.update(DEBUG=True)
#app.run(debug=Ture)
# app.config.from_pyfile('config.py')
# app.config.from_object(config)
# app.config.from_object('config')
#若文件没有
## app.config.from_pyfile('configs.py',silent=True)
app.run()
####构造URL(url_for) 一般我们通过一个URL就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL呢?url_for函数就可以帮我们实现这个功能。url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。 通过构建URL的方式而选择直接在代码中拼URL的原因有两点
- 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
- url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮我们搞定
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/article/<id>/')
def article(id):
return '%s article detail' % id
@app.route('/')
def index():
print(url_for("article",id=1))
return "首页"
往下将介绍重定向与url_for的区别
硬编码是大家不太喜欢的,url_for的优点是让代码更灵活,在开发中一般不改变方法名,更多的是改变路由,url_for就指定方法名的路由
####指定URL末尾的斜杠 有些URL的末尾是有斜杠的,有些URL末尾是没有斜杠的。这其实是两个不同的URL
@app.route('/article/')
def articles():
return '文章列表页'
若article后面没有斜杠,则会报404的错误,当然如果你写代码的时候末尾加了斜杆那么页面会自动补齐
####指定HTTP方法 在@app.route()中可以传入一个关键字参数methods来指定本方法支持的HTTP方法,默认情况下,只能使用GET请求
@app.route('/login/',methods=['GET','POST'])
def login():
return 'login'
以上装饰器将让login的URL既能支持GET又能支持POST
在登录的时候会用到
####页面跳转和重定向
举个例子,相当于你某宝上买东西,当你没登陆付款时,就会跳转到登录页面
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。 • 永久性重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。 • 暂时性重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。 在flask中,重定向是通过flask.redirect(location,code=302)这个函数来实现的,location表示需要重定向到的URL,应该配合之前讲的url_for()函数来使用,code表示采用哪个重定向,默认是302也即暂时性重定向,可以修改成301来实现永久性重定向
from flask import Flask,url_for,redirect,request
app = Flask(__name__)
@app.route('/')
def index():
print(url_for("article_list",aid=3))
return "hello world"
@app.route('/article/<aid>/')
def article_list(aid):
return "article list {}".format(aid)
@app.route('/signin/', methods=['GET','POST'])
def login():
return 'login'
@app.route('/profile/', methods=['GET','POST'])
def profile():
name = request.args.get("leo") #此处的c是后面的传参 http://127.0.0.1:2000/profile/?leo=lei
#get请求
#request.form.get("name")
#post请求
# if name:
# return name
# else:
# return redirect("/login/")
if not name:
return redirect(url_for('login'),code = 301) #url_for 指定函数url
else:
return name
if __name__ == "__main__":
app.run()
####关于响应(Response) 视图函数中可以返回以下类型的值: • Response对象。 • 字符串。其实Flask是根据返回的字符串类型,重新创建一个werkzeug.wrappers.Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象。 • 元组。元组中格式是(response,status,headers)。response为一个字符串,status值是状态码,headers是一些响应头。 • 如果不是以上三种类型。那么Flask会通过Response.force_type(rv,request.environ)转换为一个请求对象。 直接使用Response创建
from werkzeug.wrappers import Response
@app.route('/about/')
def about():
resp = Response(response='about page',status=200,content_type='text/html;charset=utf-8')
return resp
可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如设置cookie,header信息
from flask import make_response
@app.route('/about/')
def about():
return make_response('about page')