创建flask项目后,会生成被@app.route()
装饰的函数,被这个函数装饰的函数称为视图函数,它添加了访问URL的规则“/”,“/”代表网站的根路径,只要在浏览器中输入网站的域名,就可以访问到以“/”为路径的页面。
@app.route('/')
def hello_world(): # put application's code here
return 'Hello hh!'
而此时hello_world函数什么也没做,只是简单地返回字符串“Hello hh!”,因此在浏览器,我们就可以看到“Hello hh!”。
@app.route('/profile')
def profile():
return "Welcome to my channel~"
👆此时,访问域名/profile
,即可查看新定义的界面。注意,装饰器的URL设置为/profile
,函数的名字不需要必须是profile。
@app.route('/blog/' )
def blog_detail(blog_id):
return "您查找的博客id为:%d" % blog_id
👆可以看到,URL中多了一对尖括号,并且尖括号中多了一个blog_id,这个blog_id就是传给视图函数的参数。当浏览器访问这个URL时,Flask会接收请求,并自动解析URL中的参数blog_id,把它传给视图函数blog_detail,在视图函数中,开发者可以根据blog_id从数据库中查找相应的博客数据返回给浏览器。此时,在浏览器中输入域名/blog/1
,即可返回相应的视图。
注意,本书的作者使用的python版本为3.9,在书中视图函数的返回值为return "您查找的博客id为:" % blog_id
,没有做类型匹配,这样做在我这里会报错。
@app.route('/blog/list/' )
def show_list(category):
return "当前的博客分类为%s" % category
@app.route('/blog//' )
def blog_detail(blog_id,page_id):
return "您查找的博客id为%d, 页面为%d" % (blog_id,page_id)
@app.route('/blog/' )
@app.route('/blog//' )
def blog_detail(blog_id,page_id=1):
return "您查找的博客id为%d, 页面为%d" % (blog_id,page_id)
?
把参数添加上去,如果有多个参数则通过&
拼接,规则如下:URL?参数名1=参数值1&参数名2=参数值2
在URL中定义参数再传递参数比通过查询字符串的方式传递参数更有利于SEO的优化,能更好地被搜索引擎收录和检索。如CSDN博客网站的博客详情页面就是通过博客id在URL中定义参数再传递参数;而使用字符串查询更加灵活。
说白话就是实现页面的跳转。如,访问某个网站时,不允许直接进入主页,则会先自动跳转至登录页面登录,在flask中使用flask.redirect实现重定向,重要参数为location和code,location为重定向的URL,而code指状态码,默认为302(暂时重定向)。
@app.route("/login")
def login():
return "login page"
@app.route("/profile")
def profile():
name = request.args.get("name")
if not name:
return redirect("/login")
else:
return name
直接登录到profile:
使用字符串搜索令name=admin
登录到profile
上面实现的页面跳转登录,是直接把URL硬编码进去的,牺牲了一定的鲁棒性,更好的方式是通过url_for函数动态地构造url。url_for接收视图函数名作为第一个参数,以及其他URL定义时的参数,如果还添加了其他参数,将会添加到URL的后面作为查询字符串参数。
@app.route("/blog/" )
def blog_detail(blog_id):
return "您查找的博客id为: %s" % blog_id
@app.route("/urlfor")
def get_url_for():
url = url_for("blog_detail",blog_id=2,user="admin")
return url