Flask基础之session验证与模板渲染语法(jinja2)
1.http传输请求头参数
request.headres 之 请求头中数据显示:
print(type(request.headers))
"""
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1:5000/home
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
Cookie: csrftoken=vDIozqveCEfArdYXlM6goHVlSQEn7h4bDygNphL2Feas60DiM2di0jlqKfxo7xhA
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
"""
2.Flask中request.data参数处理
request.data 之 如果处理不了的就变成字符串儿存在data里面
request 是基于 mimetype 进行处理的
mimetype的类型 以及 字符串儿 : http://www.w3school.com.cn/media/media_mimeref.asp
如果不属于上述类型的描述,request就会将无法处理的参数转为Json存入到 data 中
其实我们可以将 request.data , json.loads 同样可以拿到里面的参数
其他request参数:
request.获取各种路径之这些方法没必要记,但是要知道它存在
# 获取当前的url路径
print(request.path)# /req
# 当前url路径的上一级路径
print(request.script_root) #
# 当前url的全部路径
print(request.url) # http://127.0.0.1:5000/req
# 当前url的路径的上一级全部路径
print(request.url_root ) # http://127.0.0.1:5000/
3.Flask中request.json参数
request.json 数据在提交数据时,需要指定参数的格式是json格式
如果在请求中写入了 "application/json" 使用 request.json 则返回json解析数据, 否则返回 None
4.Flask中的session管理
Flask中的session是flask自带的模块
session生成机制:先创建一个字典,再secret_key + 时间戳 + flask内置签名 加密 形成
- secret_key :可以任意指定一个加密字符串
- 时间戳:保存session的过期时间
- 签名:内置签名,应用于session加密
实例:
from datetime import timedelta
from flask import Flask, session, request, render_template, redirect
app = Flask(__name__)
# 随机创建一个session的key
app.secret_key = "#$%^&*#$%^&#$%2213123^&"
# 调试模式
app.debug = True
# 更改session的名字
app.session_cookie_name = "I am Not Session"
# 设置session的过期时间,15秒
# app.permanent_session_lifetime = 15
@app.route("/login", methods=["POST", "GET"])
def login():
if request.method == "GET":
return render_template("login.html")
else:
uname = request.form.get("username")
pwd = request.form.get("pwd")
if uname == "123" and pwd == "123":
# 设置session
session["username"] = uname
return "200 OK"
else:
return "登录失败!"
@app.route("/detail")
def detail():
# 验证session设置是否成功
if session.get("username"):
return render_template("index.html")
else:
return redirect("/login")
if __name__ == '__main__':
app.run("0.0.0.0", 9527)
HTML文件:
...
<form action="" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username">
密码:<input type="password" name="pwd">
<input type="submit" value="提交">
</form>
...
5.Flask中模板语法(if,for语法数据处理)
falsk模板语法是基于jinja2语法实现
from flask import Flask, render_template
STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}
STUDENT_LIST = [
{'name': 'Old', 'age': 38, 'gender': '中'},
{'name': 'Boy', 'age': 73, 'gender': '男'},
{'name': 'EDU', 'age': 84, 'gender': '女'}
]
STUDENT_DICT = {
1: {'name': 'Old', 'age': 38, 'gender': '中'},
2: {'name': 'Boy', 'age': 73, 'gender': '男'},
3: {'name': 'EDU', 'age': 84, 'gender': '女'},
}
app = Flask(__name__)
app.debug = True
@app.route("/index")
def index():
return render_template("index1.html",
stu_info=STUDENT,
stu_list=STUDENT_LIST,
sd=STUDENT_DICT)
if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 9527)
HTML文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 普通字典数据处理 #}
{{ stu_info }}
<table border="1ps">
<tr>
<td>name</td>
<td>age</td>
<td>gender</td>
</tr>
<tr>
<td>{{ stu_info.name }}</td>
<td>{{ stu_info.age }}</td>
<td>{{ stu_info.gender }}</td>
</tr>
</table>
{# 列表中嵌套字典数据的处理 #}
<hr>
{{ stu_list }}
<table border="1ps">
<tr>
<td>name</td>
<td>age</td>
<td>gender</td>
</tr>
{% for foo in stu_list %}
<tr>
<td>{{ foo.name }}</td>
<td>{{ foo.age }}</td>
{% if foo.gender != "男" and foo.gender != "女" %}
<td>女</td>
{% else %}
<td>{{ foo.gender }}</td>
{% endif %}
</tr>
{% endfor %}
</table>
{# 字典数据类型处理 #}
<hr>
{{ sd }}
<table border="1ps">
<tr>
<td>name</td>
<td>age</td>
<td>gender</td>
</tr>
{% for k,v in sd.items() %}
<tr>
<td>{{ v.name }}</td>
<td>{{ v.age }}</td>
<td>{{ v.gender }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
6.Flask中模板语法(自定义函数方法)
通过定义全局变量的方法,不需要导入则可以直接在模板中使用:
from flask import Flask, render_template #装饰自定义方法
app = Flask(__name__)
app.debug = True
# 自定义方法,这里装饰的函数是一个全局变量
@app.template_global()
def ab(a, b):
return a + b
@app.template_filter() # 定义全局模板函数
def a_b_c_sum(a, b, c):
return a + b + c
@app.route("/index")
def index():
return render_template("index1.html")
if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 9527)
HTML文件:输出结果3
...
<body>
<h3>自定义的方法ab</h3>
输出结果:{{ ab(1,2) }}
<br>
{{ 1 | a_b_c_sum(197,2) }}
</body> </html>
7.Flask中模板语法(后端创建标签)
7.1 后端通过Markup方法实现标签:
后端创建一个字符串标签,通过Markup指定字符串是一个标签,否则前端则会显示一个字符串
from flask import Flask, render_template, Markup
app = Flask(__name__)
app.debug = True
@app.route("/index")
def index():
# Markup标签转义,字符串转换成标签
my_in = Markup("<input type='text' name='uname'>")
return render_template("index1.html", m=my_in)
if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 9527)
HTML文件:
...
<body>
<hr>通过后端代码创建一个标签:
输入框:{{ m }}
</body>
</html>
7.2 前端通过safe过滤器实现标签:
from flask import Flask, render_template
app = Flask(__name__)
app.debug = True
@app.route("/index")
def index():
my_in = "<input type='text' name='uname'>"
return render_template("index1.html", m=my_in)
if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 9527)
HTML文件:
...
<body>
<hr>通过前端过滤器创建一个标签:
输入框:{{ m | safe }}
</body>
</html>
8.Flask中模板语法(macro方法)
from flask import Flask, render_template
app = Flask(__name__)
app.debug = True
@app.route("/index")
def index():
return render_template("index1.html")
if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 9527)
HTML文件:
mscro是直接在前端实现标签的创建,目前有点鸡肋,没什么用处
...
<body>
<hr>通过macro方式创建一个标签:
{% macro my_input(na, ny) %}
<input type="{{ ny }}" name="{{ na }}">
{% endmacro %}
输入框:{{ my_input("uname", "type") }}
</body>
</html>
9.Jinja2模板复用 block
如果我们前端页面有大量重复页面,没必要每次都写,可以使用模板复用的方式复用模板
前端代码:
index.html 文件中的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>下面的内容是不一样的</h2>
{% block content %}
{% endblock %}
<h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Welcome OldboyEDU</h1>
<h2>下面的内容是不一样的</h2>
{% block content %}
{% endblock %}
<h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
<h1>OldboyEDU is Good</h1>
</body>
</html>
login.html 文件中的内容
{% extends "index.html" %}
{% block content %}
<form>
用户名:<input type="text" name="user">
密码:<input type="text" name="pwd">
</form>
{% endblock %}
{% extends "index.html" %}
{% block content %}
<form>
用户名:<input type="text" name="user">
密码:<input type="text" name="pwd">
</form>
{% endblock %}
后端代码:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/login")
def login():
return render_template("login.html")
@app.route("/home")
def home():
return render_template("home.html")
app.run("0.0.0.0", 5000, debug=True)
10.Jinja2模板语言的模块引用 include
include模板语法:就是将 login.html 当成一个模块,加载到 index.html 页面中
login.html 文件中的内容:
<form>
用户名:<input type="text" name="user">
密码:<input type="text" name="pwd">
</form>
index.html 文件中的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Welcome</h1>
<h2>下面的内容是不一样的</h2>
{% include "login.html" %}
<h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
</body>
</html>
后端代码:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
app.run("0.0.0.0", 5000, debug=True)
Flask基础之session验证与模板渲染语法(jinja2)的更多相关文章
- flask基础之session原理详解(十)
前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...
- Flask初级(六)flash模板渲染
Project name :Flask_Plan templates:templates static:static 继续上篇的模板 我们已经可以静态调用模板,包括继承模板,保证了页面的一致性,但是我 ...
- TP5 模板渲染语法
每次都要去网上找,又发现都不全.所以自己记录一下 volist:循环 {volist name="collection" id="v"} {/volist} i ...
- Flask基础总结
Flask 基础总结 .Flask优点: 拥有强大的第三方组件小而精非常全面,不足就是更新太快 .Flask中的三剑客: HTTPRespone redierct render_template .F ...
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- django 第四天模板渲染
今日内容 一.模板渲染 语法 {{ 变量 }} {% 逻辑 %} 1.变量 取列表中的第几个元素,用索引 <p>{{ namelist.2 }}</p> 取字典中的第几个元素用 ...
- 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- Flask中的request模板渲染Jinja以及Session
Flask中的request与django相似介绍几个常用的以后用的时候直接查询即可 1.request from flask import request(用之前先引用,与django稍有不同) r ...
- python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)
一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...
随机推荐
- 洛谷 P1234 小A的口头禅
这里是传送门啊 I'm here! 题目描述 小A最近有了一个口头禅"呵呵",于是他给出了一个矩形,让你求出里面有几个hehe(方向无所谓). 输入输出格式 输入格式: 第一行两个 ...
- 使用PostMan进行压力/性能测试
1. 2. 3. 4.查看结果/导出结果
- 根据IP查询所在城市接口(查询用户所在城市)
转自:https://blog.csdn.net/liona_koukou/article/details/75646313 最近项目有用到定位用户客户端打开页面时所在的城市的需求,找到如下接口,做个 ...
- 数据结构与算法系列——排序(4)_Shell希尔排序
1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...
- 《Linux就该这么学》培训笔记_ch10_使用Apache服务部署静态网站
<Linux就该这么学>培训笔记_ch10_使用Apache服务部署静态网站 文章最后会post上书本的笔记照片. 文章主要内容: 网站服务程序 配置服务文件参数 SELinux安全子系统 ...
- 《Linux就该这么学》培训笔记_ch14_使用DHCP动态管理主机地址
<Linux就该这么学>培训笔记_ch14_使用DHCP动态管理主机地址 文章最后会post上书本的笔记照片. 文章主要内容: 动态主机地址管理协议 部署dhcpd服务程序 自动管理IP地 ...
- python入门之名称空间
name = 'tank' 什么是名称空间? 存放名字的空间 如果你想访问一个变量值,必须先访问对应的名称空间,拿到名字和对应的内存地址的绑定关系 名称空间的分类: 1.内置名称空间: python提 ...
- 032 搭建搜索微服务01----向ElasticSearch中导入数据--通过Feign实现微服务之间的相互调用
1.创建搜索服务 创建module: Pom文件: <?xml version="1.0" encoding="UTF-8"?> <proje ...
- Jvm内存总结
对于不同的Jvm及不同的jdk版本内存模型不同 内存区域 名称 作用 参数 异常 分析方法 解决方案 Heap 堆内存 存储对象 -Xms -Xmx Java.lang.OutOfMemeoryErr ...
- RSA公钥加密私钥解密
公司的项目需要电科院测评,必须保证数据的完整性和保密性,为这两个特性不得不搞个RSA+SHA1加密. 页面处理过程: 每次登录前,先向后端发送请求,由RSA生成一对公钥和私钥,获取公钥中的模modul ...