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. 【Git】git-filter-branch - Rewrite branches

    1.命令使用场景 ①Removing sensitive data from a repository(https://help.github.com/en/github/authenticating ...

  2. python 练习题2

    # 习题1:# 设定一个用户名和密码,用户输入正确的用户名和密码,# 则显示登录成功,否则提示登录失败,用户最多失败3次,# 否则退出程序.username="test"passw ...

  3. Github安装和使用(超级详细)

    Github (原创:黑小子-余) 小编我是一名Git新手,然后花三天时间通过查找网上资料,了解Git的简单使用.本次我就实战操作git安装.github仓库创建.上传代码到github上.从gith ...

  4. 解决Coursera视频无法观看的三种方法(亲测有效)

      ​   最近在coursera上课时出现了视频黑屏,网页缓冲,无法观看等问题,经过查询发现很多人也有同样的问题.对于不同的原因,一般来说解决方法也不同.这里有三种办法,大家可以挨个尝试,肯定有一个 ...

  5. 开发者请注意:Python2 的最后版本将于 4 月发布,但它确实是在 1 月 1 日就寿命终止了!

    2020 年 1 月 1 日是 Python2 的寿命终止日,这个日期在两年前经"Python之父" Guido van Rossum 宣布,此后一直成为开发者社区翘首以盼的一天. ...

  6. $[NOIp2015]$ 子串 $dp$

    \(Sol\) 不知道为啥看起来就很\(dp\)的亚子.我们关心的只有\(A\)串当前用到哪一个,\(B\)串已经匹配到哪个位置,已经匹配的被分成了多少段.所以设\(f_{i,j,k,0/1}\)表示 ...

  7. 1062 最简分数 (20分)C语言

    一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0.最简分数是指分子和分母没有公约数的分数表示形式. 现给定两个不相等的正分数 N1/M1和 N2/M​2,要求你按从小到大的顺序列出它们之间 ...

  8. 1048 数字加密 (20 分)C语言

    本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...

  9. echo 传义序列

    echo 传义序列:\a 警示字符\b 退格\c 输出中忽略最后的换行符\f 清屏\n 换行\r 回车\t 水平制表符\v 垂直制表符\\ 反斜杠字符\0ddd 将字符表示成1到3位的八进制数值

  10. Windows系统下批处理快速创建WIFI

    为什么要用cmd这种古老的东西创建wifi呢,电脑管家.360安全卫士都有这种插件,一键开启关闭,多方便啊! 开始用的也是电脑管家的免费wifi插件,但是我越来越不能忍它极慢的启动关闭过程,每一次看着 ...