【Python搞搞轻量Blog】第二发 Flask入门(2)

上一篇文章 Flask入门 中创建了一个非常简单的Web应用。
但从最简单中又稍微深入的说了一下Flask 基于Werkzeug。
使用模板 (利用HTML)
如何快速利用写好的HTML呢?
【Python搞搞轻量Blog】第二发 Flask入门(2)_第1张图片
第一步: 在和主应用的同级目录下,创建一个名为 templates 文件夹。

这个就是存放模板的文件夹,模板就是html文件

第二步:在templates 文件下新建一个index.html 文件
【Python搞搞轻量Blog】第二发 Flask入门(2)_第2张图片
然后看下我们的主程序代码,如何去利用模板。

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’)

我们看下效果
【Python搞搞轻量Blog】第二发 Flask入门(2)_第3张图片
有人会问了,如果不传入后面的参数,模板中会显示什么呢?

答: 当不传入参数,模板中的变量就是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
【Python搞搞轻量Blog】第二发 Flask入门(2)_第4张图片
这个函数可用与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"

【Python搞搞轻量Blog】第二发 Flask入门(2)_第5张图片
可以看到,没有给我们渲染 Test,而是返回401放弃请求的错误。

表示禁止访问,之后的语句用于不会执行。

你可能感兴趣的:(python,程序员,编程语言,python)