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....)   %}

原文地址:https://www.cnblogs.com/qj696/p/11164801.html