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的更多相关文章

  1. flask 之request用法

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  2. Flask中request参数

    首先要明确一件事,Request这是个对象,不管使用PHP还是python还是什么java语言,虽然request这个对象可能叫的名字不一样,(在其他语言中可能叫什么HttpRequest),但是原理 ...

  3. 【Flask】关于Flask的request属性

    前言 在进行Flask开发中,前端需要发送不同的请求及各种带参数的方式,比如GET方法在URL后面带参数和POST在BODY带参数,有时候又是POST的表单提交方式,这个时候就需要从request提取 ...

  4. Flask入门request session cookie(二)

    1 HTTP方法分类 1 GET 浏览器告知服务器:只获取页面上的信息并发给我.这是最常用的方法. 2 HEAD 浏览器告诉服务器:欲获取信息,但是只关心消息头 .应用应像处理 GET 请求一样来处理 ...

  5. flask中的Flask、request、render_temple、redirect和url_for

    学flask也有一个多星期了,对这个web框架也有了一点的了解,梳理一些基础的知识点,还是小白一只,代码写得比较low,若文章有错误的地方欢迎大佬随时指正,代码中被注释掉的代码是关于预防csrf,无视 ...

  6. Flask中request与response参数

    目录 request response request from flask import Flask from flask import request app = Flask(__name__) ...

  7. Flask请求request

    Flask中的request是一个公共变量,需要导入request from flask import Flask,request 接收url中的参数 @app.route("/req&qu ...

  8. python flask的request模块以及在flask编程中遇到的坑

    一.首先来讲讲遇到的坑: 1.linux下package的打包引用: """ 路径结构如下: ./project ./bin ./api ""&quo ...

  9. Flask的request和session是从哪里来的?

    因为之前一直在项目中使用django, 所以在学习Flask的过程中, 难免对吧django和Flask进行对比, 这一次我发现Flask中的request和session并没有想象的那么简单, 所以 ...

随机推荐

  1. 错误 1 未能找到类型或命名空间名称“”, 引入DLL文件出现提示文件不存在问题

    在所有引入都正确的情况下,查看项目目标框架是否正确

  2. TCP/IP||ARP/RARP

    1.ARP ARP(地址解析协议)主要为IP地址到对应的硬件提供动态映射,过程是自动完成 在网络接口有一个硬件地址(48 bit),在硬件层次上的数据帧交换必须有正确的接口地址,但是32 bit 的I ...

  3. Struts||IQ

    Here's question about struts2....... 1.struts2原理 初始的请求通过一条标准的过滤器链,到达 servlet 容器 ( 比如 tomcat 容器,WebSp ...

  4. Spring Boot 整合 slf4j+log4j2 实现日志管理

    背景 Java 中比较常用的日志框架: log4j(Log for Java):Apache 的一个开源项目,七种日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE ...

  5. ELK学习实验005:beats的一些工具介绍

    一 背景需求 Nginx是一个非常优秀的web服务器,往往Nginx服务会作为项目的访问入口,那么,nginx的性能保障就会变得非常重要,如果nginx的运行出现了问题就会对项目有较大的影响,所以,我 ...

  6. 使用PAC file结合ATS控制访问

    介绍:前面已经介绍了ATS的安装和PAC文件的写法格式,现在把nginx端口转发,pac file访问控制和ATS代理结合起来分别控制不同的机器访问不同URL权限的目的 效果如下 一.使用nginx端 ...

  7. 010 Ceph RGW对象存储

    一.对象存储 1.1 介绍 通过对象存储,将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据 对象通过Object ID来检索,无法通过普通文件系统操作来直接访问对象,只能通过API来访问 ...

  8. java连接elasticsearch:查询、添加数据

    导入jar包 <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport --> <depe ...

  9. 洛谷P1638 逛画展 题解 尺取法/双指针/队列

    题目链接:https://www.luogu.com.cn/problem/P1638 题目大意: 给你一个长度为 \(n (\le 10^6)\) 的数组,数组中每个元素的范围在 \(1\) 至 \ ...

  10. 「SP25784」BUBBLESORT - Bubble Sort 解题报告

    SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...