上一篇文章 Flask入门 中创建了一个非常简单的Web应用。
但从最简单中又稍微深入的说了一下Flask 基于Werkzeug。
使用模板 (利用HTML)
如何快速利用写好的HTML呢?
第一步: 在和主应用的同级目录下,创建一个名为 templates 文件夹。
这个就是存放模板的文件夹,模板就是html文件
第二步:在templates 文件下新建一个index.html 文件
然后看下我们的主程序代码,如何去利用模板。
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html",name='Stronger') # 模板名称为 index.html
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8080,debug=True)
第一行: 新导入了一个 render_template 函数
第六行代码: 调用render_template,传入的第一个参数是模板的文件名称,它会在主程序的同级目录下去寻找一个名为templates的文件夹,在这个文件下去寻找模板。第二个传入的参数,会在模板中显示,看上面的html代码图片,发现在第 10 行中有 {{ name }} 这样的一个写法。这里的 name就是你在主程序中传入的参数。
如果我将 {{ name }} 改为 {{ user }} 呢?
那我就需要在主程序中,将render_template(“index.html”,name=’Strong’) 改为 render_template(“index.html”,user=’Strong’)
我们看下效果
有人会问了,如果不传入后面的参数,模板中会显示什么呢?
答: 当不传入参数,模板中的变量就是None,不会显示。
可不可以改存放模板的文件夹呢?
答:可以,在 Flask(name) 修改代码为 Flask(name,template_folder=”存放模板文件夹名称”)
在模板中编程
在 Flask入门 中我就说过可以使用jinjia2模板引擎。
使用jinjia2模板引擎的好处在于: 渲染速度快、方便、可进行模板继承,让模板重复使用、可在模板中进行宏、可进行模板直接的导入
我就不举例了,直接列出一些语法。(偷偷懒)
{# … #} 模板中的注释
{% … %} 用于执行for循环,if条件判断登语句
{{ … }} 用于把表达式的结果输出到模板上,不止可以传数值,还能传列表,数组,字典等
URL 规则
一个关于指定路由的坑:
很多人会这样指定路由
@app.route('/user')
但是这样写路由,当访问 /user/的时候,就会产生一个 “Not Found”的错误,而且会被搜索引擎引用同一个页面两次,第二次则是 /user/ 这样的。
所以,最好的写法应该这样写。
@app.route('/user/')
在结尾加上 / ,既不失优雅,又不失B格
现在,我需要写三个相似的路由,/user/1/ /user/2/ /user/3/ 这样的三个路由。
难道需要我这样写三次吗?
@app.route('/user/1/')
@app.route('/user/2/')
@app.route('/user/3/')
def user():
pass
这样写就显得太Low了。
应该这样写:
@app.route('/user/')
def user(uid):
pass
第一行: 尖括号里面的内容是动态的,凡是匹配到/user/前缀的URL都会映射到这个路由上,在内部将uid作为参数。默认的数值类型是字符串,如果需要指定其他类型,则需要其他写法
通常格式是 converter:variable_name 其中,冒号左边的 converter 有这样几种
string 接受任何没有/的文本,这也是默认
int 整数型
float: 浮点型
path: 路径,接受/
当然,可以自己去写一个匹配方法,也可以使用正则表达式去匹配,后面如果需要,我就多BB。
第二行:函数中形参uid 接收的值就是装饰器中尖括号的值
比如我现在访问 /user/100,那么uid的值就为100,函数中uid的值也是100
构造URL
Flask用url_for()函数构造url,用起来很方便。它的第一个参数是函数名.
举例:现在我要利用url_for()去构造一个有参数id=10,name=‘XeanYu’,age=16的一个URL
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/user/')
def index():
print(url_for('index',id=10,name='XeanYu',age=16))
return 'Test'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8080,debug=True)
可以看到,我们首先需要先导入 url_for
重点在于第6行
第6行: 第一个参数是函数名,第二个参数id=10,第三个参数name=XeanYu,第四个参数age=16
这个函数可用与jinjia2的模板中。
跳转和重定向
跳转(状态码通常301) => 通常用于旧网址转移到了新网址
重定向(状态码通常302) => 表示页面是暂时性的转移
在Flask中,重定向是 redirect
举例:
from flask import Flask,url_for,redirect
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('user'))
@app.route('/user/')
def user():
return 'This is User'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8080,debug=True)
我们在第一行中导入了redirect
当我们访问 index 路由时,就会自动重定向到user路由,状态码为302。你也可以在redirect中指定状态码,比如我要指定状态码为301,我就会这样写: redirect(url_for(‘user’),code=301)
方法 Method
前端通常少不了GET或者POST这两种方法。
我们如何在应用中搞定GET或者POST呢?
首先,我们需要在指定路由的时候就去允许页面去使用GET和POST等其他方法。
@app.route('/',methods=['GET','POST'])
这样就允许了GET和POST方法了。
GET方法默认就存在。
abort错误
你可以用 redirect() 函数把用户重定向到其它地方。放弃请求并返回错误代码,用 abort() 函数。这里是一个它们如何使用的例子:
from flask import abort, redirect, url_for,Flask
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
abort(401)
return "Test"
可以看到,没有给我们渲染 Test,而是返回401放弃请求的错误。
表示禁止访问,之后的语句用于不会执行。