Day30/100 Flask中的变量和HTTP方法?
文 | 酷头
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3MjU2NzkyMA==&action=getalbum&album_id=1776320890310295553#wechat_redirect
变量
当我们在@app.route()中添加URL时,URL有时候是有变化的,例如我们常见到的不同登陆用户的名称,不同商品的ID等
针对这种情况,我们就需要构造动态的URL。这就需要给URL添加变量部分
变量的命名规则是<变量名>
如果需要指定变量类型,那就是<变量类型:变量名>
我们来看一组实例,根据不同用户名称输出相应的用户信息
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello world'
@app.route('/user/<username>')
def show_username(username):
return f'欢迎{username}光临!'
if __name__ == '__main__':
app.run(
debug=True,
port=8888
)
我们再来看一组指定变量类型的实例
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello world'
@app.route('/id/<int:id_no>')
def show_id(id_no):
return f'该产品的id是{id_no}'
if __name__ == '__main__':
app.run(
debug=True,
port=8888
)
如果你输入其它类型的数据则会报错
构造URL
如果flask能匹配URL,那么就可以生成它们.
这里我们使用url_for()来给指定的函数构造URL,他的第一个参数是函数名
其余参数会添加到URL末尾作为查询参数
使用url_for()函数可以构造url, 所以它经常结合redirect()函数用来跳转页面
url_for()和redirect()函数需要从Flask模块导入
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello world'
@app.route('/login')
def login():
flag = 'success'
if flag:
return redirect(url_for('index'))
return '登陆页面'
if __name__ == '__main__':
app.run(
debug=True,
port=8888
)
会调用login()方法.
若果登陆成功的话,就是使用redirect()函数跳转至index方法,如下:
HTTP方法
HTTP,即超文本传输协议,是一种实现客户端和服务器之间通信的响应协议,它是用作客户端和服务器之间的请求。
http(web应用会话协议)有许多不同的访问URL方法,默认情况下,
路由只回应get方法.
如果我们有其他请求的话,需要通过route()装饰器传递method()参数
来改变这个行为
@app.route('/login', methods = ['GET','POST'])
def login():
if request.method == 'POST':
xxxx11
else:
xxxx22
常见HTTP方法
静态文件
动态web程序也需要静态文件,该文件通常是css和Javascript文件.
默认情况,这些静态文件都是放在一个名为static的文件夹中的
目录如下:
那么如何给静态文件生成URL呢,我们可以使用特殊的'static'端点名
url_for('static', filename = 'style.css')
使用上url_for()函数可以生成style.css文件的目录,
即为'static/style.css'
模板
模板是一个包含响应文本的文件,包含使用占位符表示的动态部分,具体值在请求上下文才能知道。
使用真实值替换变量,得到返回字符,这一过程称之为渲染。
模板渲染
默认情况下,Flask在程序文件夹templates子文件夹中寻找模板.
使用render_template()渲染模板
render_template('template_name.html', var_name = name)
render_template()函数需要从Flask函数导入,它的第一个参数是渲染模板的名称
其余参数为模板变量的值
我们来看一组实例
我们在template文件夹下创建文件,命名为index.html
然后在run.py中渲染该文件
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/css/bootstrap.css">
<script src="/static/js/jquery.js"></script>
<script src="/static/js/bootstrap.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-sm bg-primary navbar-dark">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">首页</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">德玛西亚</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">诺克萨斯</a>
</li>
<!-- Dropdown -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#"
id="navbardrop" data-toggle="dropdown">
关于我们
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">公司简介</a>
<a class="dropdown-item" href="#">企业文化</a>
<a class="dropdown-item" href="#">联系我们</a>
</div>
</li>
</ul>
</nav>
<div class="jumbotron">
<h1 class="display-3">欢迎来到{{country_name}}</h1>
<p >
{{messages}}
</p>
<hr class="my-4">
<p>
<a class="btn btn-primary btn-lg" href="#" role="button">了解更多</a>
</p>
</div>
</body>
</html>
模板的样子如下:
我们在run.py给变量加入具体的值
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/index')
def index():
name = '德玛西亚'
message = '''
在凶险海域环绕中,诸多同盟省份在一片被称为“初生之土”的庞大群岛上组成了艾欧尼亚。追寻万物的平衡是这里长久以来的文化基调,因此物质与精神领域之间的界限也在这里若有若无,在野外的森林和山脉中尤为如此。
虽然这片土地上的魔力可能变幻无常,栖息着的生物也可能危险而神奇,但在过去的几百年中,艾欧尼亚的居民一直过着富足的生活。习武的僧院、各省的民兵团、甚至就连艾欧尼亚这片土地本身,都已经足够保护当地的居民。
但那一切都在十二年前结束了,因为那一年,诺克萨斯出兵攻打了“初生之土”。一望无际的帝国大军在艾欧尼亚肆虐,艾欧尼亚人经过多年的苦战才以巨大的代价击败敌人。如今的艾欧尼亚正处于脆弱的和平中。对于那场战争的不同应对,
让这片土地产生了分裂——有一些团体,例如朔极的武僧和均衡教派,想要回归与世隔绝的和平以及田园牧歌的传统。另一些比较激进的派系,例如纳沃利兄弟会和影流,则主张对这片土地的魔法进行军事化改造,建立一个统一的国家,
强大到足以对诺克萨斯实施打击报复。艾欧尼亚的命运正悬在微妙的平衡中,几乎无人愿意使其倒向任何一边,但所有人都能感到脚下的土地在蠢动不安
'''
return render_template('index.html', country_name = name, messages = message)
if __name__ == '__main__':
app.run(
debug=True,
port=8888
)
当我们访问URL:127.0.0.1:8888/index
就会打印出如下信息:
Flask提供的render_template()函数把Jinja2模板引擎集成到了程序中
render_template()第一个参数是模板的文件名,随后的值都是键值对。
便是模板中变量对应的真实值。
在此代码中country_name = name, messages = message都属于关键字参数。
左边的country_name表示参数名,就是模板中的占位符
右边的name就是当前作用域的变量名,表示这个参数的值。
下一节我们看Flask中强大的过滤器!