初识Flask框架,以及Flask中的模板语言jinjia2和Flask内置的Session
一、web框架的对比
首先我们先来看下比较火的web框架
1.Django:
优点:大而全,所有组件都是组织内部开发高度定制化,教科书级别的框架
缺点:大到浪费资源,请求的时候需要的资源较高
2.Flask:
优势:小而精,组件只有session,第三方机构强烈支持Flask,非常多的三方组件,简单至极
缺陷:由于三方组件的关系,稳定性相对较差 Flask-session
3.Sanic
优势:异步IO非阻塞,原生WebSocket,小而精,组件只有Session,第三方机构强烈支持非常多的三方组件
缺陷:复杂度太高
扩展:
QPS = 请求每秒钟的次数
时间片:CPU工作一次的时间单位
二、Flask的安装与启动
1.首先是安装Flask,在python中直接输入安装代码即可
pip install Flask
2.启动Flask
三行启动Flask
from flask import Flask
app = Flask(__name__)
app.run()
六行代码启动Flask在前端输出Hello Flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello Flask"
app.run() ##############
其中@app.route("/")是这是当前访问路径,设置访问路径有两种方式这是第一种 def index()是视图函数
三、关于Flask响应
1.Response三贱客: 1.return HTTPResponse 对应的Flask是 return "Hello"
2.return render 对应的Flask是 return render_template("index.html")
3.return redircet 对应的Flask是 return redircet("/index")
4.return send_file("文件路径")
打开并返回文件内容,会在响应头中加入Content-Type:文件格式+Content-Length:文件大小(bytes类型)
5.return jsonify({key:value})
返回一个客户端可以识别的json格式字符串 会在响应头中加入Content-Type:application/json
四、关于Flask的请求
比较特殊,首先导入request,其中request是公共变量
from flask import request
如何从request中获取我们需要的数据
1.request.args 获取URL中的数据 2.request.form 获取FormData中的数据 3.request.values 获取args+form 4.request.data 字节流,获取请求体中的原始数据 5.request.json 字典请求体中带有Content-Type:application/json将请求体中的数据
反序列化到json中,但是在data中依然存储着原始数据bytes 6.request.files 获取FormData中的文件数据 request.files.get("文件") 7.request.files.save 保存文件(默认提交的文件名) 8.request.method 获取当前的请求方式
五、了解了这么多,是不是该写个前端试下了。Flask中默认的模板语言是jinja2
1.先来看下jinja2的模板渲染所使用的for
{% for foo in list %}
{% endfor %}
2.jinja2模板语言中的if
{% if 判断语句%}
{% elif 判断语句%}
{% else %}
{% endif %}
接下来我们把一些数据在前端生成表格
准备数据
STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'},
STUDENT_LIST = [
{'name': 'Old', 'age': 38, 'gender': '中'},
{'name': 'Boy', 'age': 73, 'gender': '男'},
{'name': 'NB', 'age': 84, 'gender': '女'}
]
STUDENT_DICT = {
1: {'name': 'Old', 'age': 38, 'gender': '中'},
2: {'name': 'Boy', 'age': 73, 'gender': '男'},
3: {'name': 'NB', 'age': 84, 'gender': '女'},
}
1.使用STUDENT字典传递至前端
后端
@app.route("/student")
def index():
return render_template("student.html", student=STUDENT)
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<div>{{ student }}</div>
<table border="1px">
<tr>
<td>{{ student.name }}</td>
<td>{{ student["age"] }}</td>
<td>{{ student.get("gender") }}</td>
</tr>
</table>
</body>
</html>
2.STUDENT_LIST列表传入前端jinja2模板的操作
后端
@app.route("/student_list")
def student_list():
return render_template("student_list.html", student=STUDENT_LIST)
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<div>{{ student }}</div>
<table border="1xp">
{% for foo in student %}
<tr>
<td>{{ foo }}</td>
<td>{{ foo.name }}</td>
<td>{{ foo.get("age") }}</td>
<td>{{ foo["gender"] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
如果需要循环遍历的话,jinja2给我们的方案是
{% for foo in student %}
<tr>
<td>{{ foo }}</td>
</tr>
{% endfor %}
上述代码中的foo就是列表中的每个字典,再用各种取值方式取出值即可
3.STUDENT_DICT字典传入前端jinja2模板
后端
@app.route("/student_dict")
def student_dict():
return render_template("student_dict.html", student=STUDENT_DICT)
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<table>
{% for foo in student %}
<tr>
<td>{{ foo }}</td>
<td>{{ student.get(foo).name }}</td>
<td>{{ student[foo].get("age") }}</td>
<td>{{ student[foo]["gender"] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
在遍历字典的时候,foo其实是相当于拿出了字典中的key
4.结合所有的字符串全部传递到前端jinja2模板中去
后端
@app.route("/allstudent")
def all_student():
return render_template("all_student.html", student=STUDENT ,
student_list = STUDENT_LIST,
student_dict= STUDENT_DICT)
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<div> _____________________________________</div>
student
<div>{{ student }}</div>
<table border="1px">
<tr>
<td>{{ student.name }}</td>
<td>{{ student["age"] }}</td>
<td>{{ student.get("gender") }}</td>
</tr>
</table>
<div> _____________________________________</div>
student_list
<div>{{ student_list }}</div>
<table border="1xp">
{% for foo in student_list %}
<tr>
<td>{{ foo }}</td>
<td>{{ foo.name }}</td>
<td>{{ foo.get("age") }}</td>
<td>{{ foo["gender"] }}</td>
</tr>
{% endfor %}
</table>
<div> _____________________________________</div>
student_dict
<div>{{ student_dict }}</div>
<table border="1xp">
{% for foo in student_dict %}
<tr>
<td>{{ foo }}</td>
<td>{{ student_dict.get(foo).name }}</td>
<td>{{ student_dict[foo].get("age") }}</td>
<td>{{ student_dict[foo]["gender"] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
这里可以看出来,render_template中可以传递多个关键字
5.jinja2模板语言中的宏定义
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <h1>jinja2模板语言中的宏定义</h1> {% macro type_text(name,type) %}
<input type="{{ type }}" name="{{ name }}" value="{{ name }}">
{% endmacro %} <h2>在下方是使用宏来生成input标签</h2> {{ type_text("one","text") }}
{{ type_text("two","text") }} </body>
</html>
但是一般很少应用的到
六、Flask中内置的Session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用也很奇怪
1.Flask中session是需要secret_key的
from flask import session
app = Flask(__name__)
app.secret_key = "DragonFire"
secret_key实际上是用来加密字符串的,如果在实例化的app中没有secret_key那么开启session一定会抛出异常
2.session的正确食用方法,哈哈哈
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
if request.form["username"] == USER["username"] and request.form["password"] == USER["password"]:
session["user"] = USER["username"]
return redirect("/student_list")
return render_template("login.html", msg="用户名密码错误")
return render_template("login.html", msg=None) # 如果前端Jinja2模板中使用了msg,这里就算是传递None也要出现msg
session["user"] = USER["username"]这样用就代表这个请求带上来的session中保存了一个user = name如果想要验证session的话,就用这种方法吧
3.cookies种的session是什么
cookies中的session存储的是通过secret_key,通过这个key从Flask程序的内存中找到用户对应的session信息
4.怎么用session进行验证
@app.route("/student_list")
def student():
if session.get("user"):
return render_template("student_list.html", student=STUDENT_DICT)
return redirect("/login")
初识Flask框架,以及Flask中的模板语言jinjia2和Flask内置的Session的更多相关文章
- Flask中的模板语言jinja2
jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ...
- Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- 3,Flask 中的模板语言 Jinja2 及 render_template 的深度用法
Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符串,用于传递到前端 S ...
- Flask中的模板语法jinjia2
Flask中默认的模板语言是Jinja2 I. Jinja2模板语言中的 for {% for foo in g %} {% endfor %} II. Jinja2模板语言中的 if {% if g ...
- Flask 中的模板语言 Jinja2 及 render_template 的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- Flask 中内置的 Session
Flask中的Session Flask中的Session不同于Django的session,django的session存在后端数据库中,而flask的session会将你的SessionID存放在 ...
- Flask最强攻略 - 跟DragonFire学Flask - 第六篇 Flask 中内置的 Session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...
- 第六篇 Flask 中内置的 Session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...
随机推荐
- 静态HTML服务器
主要代码 #pragma once#include "pre.h"#include <thread> NAMESPACE(DEF) class Socket {publ ...
- 启动项目报错:502 Server dropped connection The following error occurred while trying to access http://localhost:8080/TestDemo:
之前的项目一直是好的,可以启动,但最近启动出了问题,访问不了,于是找到原因发现是启用了访问国外网站的加速器, 更改了浏览器的代理模式,如下: 解决方法: 打开浏览器,进入到浏览器的网络设置中,将局域网 ...
- ffmpeg只编译h264
./configure --arch=arm --cross-prefix=arm-none-linux-gnueabi- --extra-ldflags=-static --target-os=li ...
- Hadoop-2.7.2分布式安装手册
目录 目录 1 1. 前言 3 2. 特性介绍 3 3. 部署 5 3.1. 机器列表 5 3.2. 主机名 5 3.2.1. 临时修改主机名 6 3.2.2. 永久修改主机名 6 3.3. 免密码登 ...
- Restful风格wcf调用3——Stream
写在前面 上篇文章介绍了restful接口的增删改查,本篇文章将介绍,如何通过数据流进行文件的上传及下载操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 一个 ...
- ISE、vivado、QuartusII调用notepad++、UE汇总(整理)
我已经用惯了notepad++编写Verilog代码,很喜欢这款编辑器,功能真的非常强大.所以,当需要对vivado.ISE或quartus ii中的工程进行Verilog代码上的编写或修改时,只需双 ...
- 结巴net 分词 配置文件路径,在网站中的出现问题的解决
用结巴分词net版,部署到网站上的时候,配置文件的地址为相对路径的时候会出现问题,绝对路径就没有问题. 原因是结巴源码中,取路径是取的应用程序的目录.如果是winform程序当然没有问题,在网站就不行 ...
- android AlertDialog.Builder(Context context)换行
今天无意中发现AlertDialog的 setMessage(String)的换行问题,很多人都说\n可以,不过的却原来就在java里面写好的是可以换行 ,但是如果这个string是在网页或者是其地方 ...
- freemarker获取变量的范围的问题
今天做freemarker的时候,想用一下全局的变量.就是在a.ftl 和 b.ftl页面里面,使用a.action里面放入request的变量.a.action的视图页面是a.ftl ,b.ftl是 ...
- Git 安装配置,key导入
系统 Centos 6.5 安装git 命令 yum install git 配置git用户名 git config --global user.name "yangchengguo&q ...