可以利用Jinja2模板引擎技术,而不需要从函数返回硬编码HTML。
Jinja2模板引擎使用以下分隔符来从HTML转义。
{% ... %}
用于多行语句{{ ... }}
用于将表达式打印输出到模板{# ... #}
用于未包含在模板输出中的注释# ... ##
用于单行语句
来自客户端网页的数据作为全局请求对象发送到服务器。要处理请求数据,请求对旬应该从Flask模块导入。
请求对象的重要属性如下所列 -
form
- 它是包含表单参数及其值的键和值对的字典对象。args
- 解析问号(?
)后的URL部分查询字符串的内容。cookies
- 保存Cookie名称和值的字典对象。file
- 与上传文件有关的数据。method
- 当前请求方法。
在URL规则中指定http方法。URL映射的函数接收到的表单数据可以以字典对象的形式收集,并将其转发给模板以在相应的网页上呈现它。
模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”
Flask是使用 Jinja2 这个模板引擎来渲染模板
视图函数只负责业务逻辑和数据处理(业务逻辑方面)
而模板则取到视图函数的数据结果进行展示(视图展示方面)
代码结构清晰,耦合度低
模板:
Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名。
官方文档
Flask提供的 render_template 函数封装了该模板引擎
render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。
{{}} 来表示变量名,这种 {{}} 语法叫做变量代码块
<h1>{{ post.title }}</h1>
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器。
链式调用
{{ "hello world" | reverse | upper }}
{% for k, v in user.items() %}
<p>{{ k }}: {{ v }}</p>
{% endfor %}
{% if %} <p>{{ k }}: {{ v }}</p> {% endif %}
控制代码块主要包含两个:
- if/else if /else / endif
- for / endfor
代码复用
宏 —- 类似python中的函数
创建:
{% macro 标签名(key=value)%} {% end macro %}
继承 、包含、
总结:
宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。
继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。
宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。
包含(include)是直接将目标模板文件整个渲染出来。
跨站攻击:
Cookie以文本文件的形式存储在客户端计算机上。 其目的是记住和跟踪与客户使用有关的数据,以获得更好的访问体验和网站统计。
Request对象包含一个cookie
的属性。 它是所有cookie变量及其对应值的字典对象,客户端已发送。 除此之外,cookie还会存储其到期时间,路径和站点的域名。
在Flask中,cookies设置在响应对象上。 使用make_response()
函数从视图函数的返回值中获取响应对象。 之后,使用响应对象的set_cookie()
函数来存储cookie。
重读cookie很容易。 可以使用request.cookies
属性的get()
方法来读取cookie。
一、request 请求
from flask import request
@blue.route('/getrequest/', methods=['GET', 'POST'])
def get_request():
if request.method == 'GET':
args = request.args
else:
form = request.form
return '获取request'
1.request的常用属性
a)methods
默认的请求方式只有GET,其他请求都需要通过参数methods进行指定。
methods=['GET', 'POST']
b)args:获取GET请求参数
flask中,要获取get请求的参数,不是通过request.GET.get(),而是通过request.args.get()获取。
request.agrs.get('参数名')
c)form:获取POST请求参数
flask中,要获取get请求的参数,不是通过request.POST.get(),而是通过request.form.get()获取。
request.form.get('参数名')
d)files 获取上传文件
e)base_url 获取请求路径
f)host 获取ip和端口
二、make_response 响应
make_response(),相当于DJango中的HttpResponse。
1.返回内容
from flask import make_response
@blue.route('/makeresponse/')
def make_response_function():
response = make_response('<h2>羞羞哒</h2>')
return response, 404
2.返回页面
from flask import make_response
@blue.route('/makeresponse/')
def make_response_function():
temp = render_template('hello.html')
response = make_response(temp)
return response
>>>注意:make_response 想要返回页面,不能直接写做:make_response('hello.html'),必须用render_template('hello.html')形式。
3.返回状态码
>>>方式一:在make_response()中传入状态码
from flask import make_response
@blue.route('/makeresponse/')
def make_response_function():
temp = render_template('hello.html')
response = make_response(temp, 200)
return response
>>>方式二:直接return状态码
from flask import make_response
@blue.route('/makeresponse/')
def make_response_function():
temp = render_template('hello.html')
response = make_response(temp)
return response, 200
三、redirect 跳转
flask中的 redirect 相当于 DJango中的 HttpResponseRedirect。
1.参数是url形式
from flask import redirect
@blue.route('/redirect/')
def make_redirect():
return redirect('/hello/index/')
2.参数是 name.name 形式
url_for 相当于reverse,name.name 相当于django中的namespace:name,第一个name是初始化蓝图时的参数名,第二个name是函数名
from flask import redirect
@blue.route('/redirect/')
def make_redirect():
return redirect(url_for('first.index'))
与Cookie不同,会话数据存储在服务器上。 会话是客户端登录到服务器并注销的时间间隔。 需要在此会话中进行的数据存储在服务器上的临时目录中。
与每个客户端的会话分配一个会话ID。 会话数据存储在cookie顶部,服务器以加密方式签名。 对于这种加密,Flask应用程序需要一个定义SECRET_KEY
。
会话对象也是一个包含会话变量和关联值的键值对的字典对象。