FLASK 三剑客 request jinjia2
Flask Web 框架
Django 15
优势 : 组件全 - admin - Model ORM - Forms
教科书式
劣势 : 加载所有组件 - 占用资源较高
重型框架
Flask 3
优势 : 轻如鸿毛 扩展性极强 三方组件全
劣势 : 什么组件都没有
三方组件全 - 版本兼容问题 导致不稳
1.Flask 安装 + 启动
from flask import Flask
app = Flask(__name__)
app.run()
高级启动:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Hello World!"
app.run()
2.Flask Response
1.HttpResponse("HelloWorld") "HelloWorld" 返回字符串
from flask import render_template 默认存放路径 templates
2.render("模板路径") render_template 返回模板
from flask import redirect 重定向
3.redirect("/")
Flask 中的返回特殊封装 2个
1.jsonify 转换标准JSON格式
响应头中加入 Content-type:application/json
在Flask 1.1.1 版本中 加入了 直接返回字典 可以不再使用jsonify了
2.send_file 发送文件
打开并返回文件内容,
自动识别文件类型,
响应头中加入Content-type:文件类型
ps:当浏览器无法识别Content-type时,会下载文件
3.Flask Request
假登录
405 请求方式不被允许 - GET请求可以 POST请求 405 Method Not Allowed
Form表单 - FormData
f orm - 表单
from flask import request 公共对象
1.request.form 获取FormData中的数据 - Form表单
2.request.args # 获取URL中的参数
3.request.files # 获取FormData中的文件数据
print(request.url) # 获取访问路径
print(request.method) # 获取请求方式
print(request.path) # 路由地址 /login
print(request.values) # Form 和 Args 中的数据
# 综合获取 X
print(request.args.get("id")) # 获取URL中的参数
print(request.args["id"]) # 获取URL中的参数
print(request.args.to_dict()) # 获取URL中的参数 转换成 字典
print(request.environ) # 获取请求原始信息
print(request.base_url) # 获取URL头,不包含参数
print(request.json) # 毁三观 1 请求头中 Content-type:application/json 数据序列化 request.json
print(request.data) # 毁三观 2 请求头中 Content-type 不包含 Form or data #####Content-type 位于 network all header
print(request.headers) # 请求头中的数据
4.Jinja2
{{}} 引用 or 执行
{%%} 逻辑语法 if else for
5.Flask中的Session 不是三方组件 //Flask-Session
from flask import session
session 交由客户端保管机制
# eyJ1c2VybmFtZSI6IjEyMyJ9.XSVpHA.W0NfiCmW-lsTV0mvQI7mx2mf1Wo
# .eJyrViotTi3KS8xNVbJSMjQyVtKBCxhiiBhhiBhjiJhgiJhiiJhBRWoBMFYkPg.XSVsaA.9merwNdTg3ZkZrdTumYRG7x8x7Y
# .eJyrViotTi3KS8xNVbJSMjQyVtKBCxhiiBhhiBhjiJhgiJhiiJhBRWoBMFYkPg.XSVsvg.6OqcN7CR6nrT2BtE-w1kBAr3xPo
# .eJxNzL0OgCAMBOB36exAoRTjs7jwUzcdNEzGdxckMV1u-e7uhnrJecRdYIG1eqS5pWCB6RccZDGtlQSjIvsRBxtbwZEmN8gZ21czK6JBiamtQhZF_qPAuR-WookH-dQO_WYiPC-8zDp8.XSVtLw.7I-z1bsqiWFln3cipbrVOpEE33g
反序列化机制 -
当客户端发起请求 - request 带上 Cookie - Cookie中有session的加密字符串 - Flask 收到Session加密字符串 - 通过secret_key解密session的加密字符串 - 获得 {username:123}
序列化机制 - 开启session - session["username"] = uname
先创建一个字典 {username:123} 接下来 通过secret_key + 时间戳 + 签名 加密 形成
# eyJ1c2VybmFtZSI6IjEyMyJ9.XSVpHA.W0NfiCmW-lsTV0mvQI7mx2mf1Wo session的加密字符串
代码
from flask import Flask, render_template, redirect, jsonify, send_file app = Flask(__name__) @app.route("/")
def home():
return "Hello World!" @app.route("/index")
def index():
return render_template("index.html") @app.route("/reback")
def reback():
return redirect("/index") @app.route("/json")
def my_jsonify():
# return jsonify({"a":1})
return {"k":"v"} @app.route("/my_file")
def my_file():
return send_file("1.rar") app.run() 2
import os from flask import Flask, render_template,request app = Flask(__name__)
# app.config["DEBUG"] = True
app.debug = True @app.route("/login",methods=["POST","GET"])
def login():
if request.method == "GET": # 请求方式 print(request.url) # 获取访问路径
print(request.method) # 获取请求方式
print(request.path) # 路由地址 /login
print(request.values) # 可以获取URL中的参数 也可以获取 FormData中的数据
# 综合获取 X
print(request.args.get("id")) # 获取URL中的参数
print(request.args["id"]) # 获取URL中的参数
print(request.args.to_dict()) # 获取URL中的参数 转换成 字典 print(request.environ) # 获取请求原始信息
print(request.base_url) # 获取URL头,不包含参数 print(request.json) # 毁三观 1 请求头中 Content-type:application/json 数据序列化 request.json
print(request.data) # 毁三观 2 请求头中 Content-type 不包含 Form or data print(request.headers) # 请求头中的数据 return render_template("login.html") if request.method == "POST":
print(request.headers)
print(request.values.to_dict()) # 可以获取URL中的参数
# print(request.form.to_dict())
username = request.form.get("username")
password = request.form["pwd"]
print(request.form)
# print(request.json) # 毁三观 1 请求头中 Content-type:application/json 数据序列化 request.json
# print(request.data) # 毁三观 2 请求头中 Content-type 不包含 Form or data 原始请求体数据 print(request.files.get("my_file"))
my_file = request.files.get("my_file")
# fp = os.path.join("templates",my_file.filename)
my_file.save(my_file.filename) if username == "123" and password == "456":
return "登录成功"
else:
return "登录失败" if __name__ == '__main__':
app.run()
3
from flask import Flask,render_template,Markup 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.config["DEBUG"] = True @app.template_global()
def ab(a,b):
return a+b #定义了一个公共函数 @app.route("/index")
def index():
my_in = Markup("<input type='text' name='uname'>")
return render_template("index.html",
stu_info=STUDENT,
stu_list=STUDENT_LIST,
sd=STUDENT_DICT,m = my_in) if __name__ == '__main__':
app.run("0.0.0.0",9527)
4
from datetime import timedelta from flask import Flask,session,request,render_template,redirect
app = Flask(__name__)
app.secret_key = "#$%^&*#$%^&#$%2213123^&"
app.debug = True
app.session_cookie_name = "I am Not Session"
# app.testing = True
# app.permanent_session_lifetime = 15 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.route("/login",methods=["POST","GET"])
def login():
if request.method == "GET":
return render_template("login.html") uname = request.form.get("username")
pwd = request.form.get("pwd") if uname == "123" and pwd == "123":
session["username"] = "先帝"
session["12e1"] = "创业"
session["asdfas"] = "未半"
session["username3"] = "挂了"
session["username4"] = "此城"
session["username5"] = "益州"
session["username6"] = "疲弊"
return "200 OK"
else:
return "失败" @app.route("/detail")
def detail():
# session["u"]
if session.get("username"):
return render_template("index.html",
stu_info=STUDENT,
stu_list=STUDENT_LIST,
sd=STUDENT_DICT)
else:
return redirect("/login") if __name__ == '__main__':
app.run("0.0.0.0",9527)
login <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login?id=1&ids=2" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username">
密码:<input type="password" name="pwd">
<input type="file" name="my_file">
<input type="submit" value="登录">
</form>
</body>
</html> index <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ stu_info }} <table border="1px">
<tr>
<td>name</td>
<td>age</td>
<td>gender</td>
</tr>
<tr>
<td>{{ stu_info.name }}</td>
<td>{{ stu_info.get("age") }}</td>
<td>{{ stu_info["gender"] }}</td>
</tr>
</table> {{ stu_list }}
<table border="1px">
<tr>
<td>name</td>
<td>age</td>
<td>gender</td>
</tr>
{% for foo in stu_list %}
<tr>
<td>{{ foo.name }}</td>
<td>{{ foo.get("age") }}</td>
<td>{% if foo["gender"] != "男" and foo["gender"] != "女" %}
女
{% else %} {{ foo["gender"] }}
{% endif %} </td>
</tr>
{% endfor %}
</table>
{{ sd }}
<table border="1px">
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>gender</td>
</tr>
{% for id,s in sd.items() %} for 循环
<tr>
<td>{{ id }}</td>
<td>{{ s.name }}</td>
<td>{{ s.get("age") }}</td>
<td>{{ s["gender"] }}</td> #django里只有s. jinjia2里 三种方法都可以
</tr>
{% endfor %}
</table> {#<center>{{ absum(1,2) }}</center>#} /*{{}}执行函数*/
{#<center>{{ ab(2,2) }}</center>#}
{##}
{#{% macro my_input(na,ty) %}#} #macro 宏指令 相当于 def
{# <input type="{{ ty }}" name="{{ na }}">#}
{#{% endmacro %}#}
{##}
{#{{ my_input("uname","text") }}#}
{#{{ m }}#}
</body>
</html>
jinjia2语言模板
{{ }}引用接收后端传过来的数据 or 执行函数
{% %} 逻辑 for if 等等 要 跟着 {% end(for/if....) %}
FLASK 三剑客 request jinjia2的更多相关文章
- flask 之request用法
每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...
- Flask中request参数
首先要明确一件事,Request这是个对象,不管使用PHP还是python还是什么java语言,虽然request这个对象可能叫的名字不一样,(在其他语言中可能叫什么HttpRequest),但是原理 ...
- 【Flask】关于Flask的request属性
前言 在进行Flask开发中,前端需要发送不同的请求及各种带参数的方式,比如GET方法在URL后面带参数和POST在BODY带参数,有时候又是POST的表单提交方式,这个时候就需要从request提取 ...
- Flask入门request session cookie(二)
1 HTTP方法分类 1 GET 浏览器告知服务器:只获取页面上的信息并发给我.这是最常用的方法. 2 HEAD 浏览器告诉服务器:欲获取信息,但是只关心消息头 .应用应像处理 GET 请求一样来处理 ...
- flask中的Flask、request、render_temple、redirect和url_for
学flask也有一个多星期了,对这个web框架也有了一点的了解,梳理一些基础的知识点,还是小白一只,代码写得比较low,若文章有错误的地方欢迎大佬随时指正,代码中被注释掉的代码是关于预防csrf,无视 ...
- Flask中request与response参数
目录 request response request from flask import Flask from flask import request app = Flask(__name__) ...
- Flask请求request
Flask中的request是一个公共变量,需要导入request from flask import Flask,request 接收url中的参数 @app.route("/req&qu ...
- python flask的request模块以及在flask编程中遇到的坑
一.首先来讲讲遇到的坑: 1.linux下package的打包引用: """ 路径结构如下: ./project ./bin ./api ""&quo ...
- Flask的request和session是从哪里来的?
因为之前一直在项目中使用django, 所以在学习Flask的过程中, 难免对吧django和Flask进行对比, 这一次我发现Flask中的request和session并没有想象的那么简单, 所以 ...
随机推荐
- IDE、Cmake、makefile、make
makefile :就是一个类似脚本的文件,根据一系列规则用于决定哪些文件先编译,哪些文件重新编译等等.甚至于进行更复杂的功能操作,而且还可以执行操作系统的命令.makefile带来的好处就是——“自 ...
- 22.文本框验证和外部url的调用
面板可以右键固定到浏览器并且横向纵向都剧中 如果要在图片上进行点击或者其他操作 可以覆盖一个图片热区或者矩形(透明的)充当一个按钮的操作 这个提示的图片是默认隐藏的 通过右上角那个隐藏的勾 文本框右边 ...
- $loj\ 2031\ [SDOI2016]$数字配对 网络流
正解:网络流 解题报告: 我永远喜欢$loj$! 显然先预处理哪些$a$之间可以连边,然后考虑建两排点,连流量为$c_{i}\cdot c_{j}$,然后$ST$连$inf$,跑个费用流? 然后现在碰 ...
- $BZOJ3232$ 圈地游戏 网络流
正解:最小割+01分数规划 解题报告: 传送门$QwQ$ 感$jio$这个好像是$NOIp2018$集训的时候$cjk$学长讲01分数规划的时候港的,,,?$QwQ$虽然我还是不会嘤 首先看到这个分数 ...
- 《带你装B,带你飞》pytest成神之路2- 执行用例规则和pycharm运行的三种姿态
1. 简介 今天北京下的雪好大好美啊!!!哎呀,忘记拍照片了,自己想象一下吧.言归真传,今天还是开始pytest的学习和修炼,上一篇写完后群里反响各式各样的,几家欢乐几家愁,有的高兴说自己刚好要用到了 ...
- 洛谷P1028 数的计算 题解 动态规划入门题
题目链接:https://www.luogu.com.cn/problem/P1028 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数 \(n\) ): 先输入一个自然数 \(n(n \ ...
- 「CH2101」可达性统计 解题报告
CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...
- 1072 开学寄语 (20分)C语言
下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟 ...
- 曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- CentOS 安装图形化界面后重启出现许可等事项操作
这是CentOS内核的初始设置页面,下面给出中文解释及操作方法. 1.CentOS Linux 7 初始设置(核心) 1)[!]许可证信息 (没有接受许可证) 请您选择[‘1’ 输入许可证信息 | ‘ ...