Flask一:安装初始,return方式,Request,Jinja2,session
生活随笔
收集整理的這篇文章主要介紹了
Flask一:安装初始,return方式,Request,Jinja2,session
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:安裝和初始
1.Flask 安裝 + 啟動from flask import Flaskapp = Flask(__name__) # 實例化flask對象 # __name__ 多app應用,分區實例在哪個文件中app.run()高級啟動:from flask import Flaskapp = Flask(__name__)@app.route("/") # app中的rotue裝飾器def home(): # 視圖函數return "Hello World!"app.run()二: Render, Redirect HttpResponse
2.Flask Response1.HttpResponse("HelloWorld") "HelloWorld" 返回字符串from flask import render_template 默認存放路徑 templates2.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:文件類型 # Content-Type: audio/mpegps:當瀏覽器無法識別Content-type時,會下載文件# 大的視頻文件是 分段式請求 # 打開并返回文件內容,自動識別文件類型,content-type:文件類型# Ps:# 瀏覽器無法識別content-type時,都以下載返回。 識別的話,直接打開 from flask import Flask, render_template, redirect, jsonify, send_file# Alt + 回車 快速的導入模塊app = Flask(__name__) # 實例化flask對象 # __name__ 多app應用,分區實例在哪個文件中app.config["DEBUG"] = True # 能夠隨時更改自動重啟,不加的話每次更改代碼需要手動重啟@app.route("/") # app中的rotue裝飾器 def home(): # 視圖函數# return 1# TypeError: The view function did not return a valid response.# The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a int.return "home"@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("/myfile") def my_file():# return send_file('1chushi.py')# return send_file('1.jpg')return send_file('ss.mp3')# 傳文件 # 不管video還是audio都是顯示 Audio app.run()三:Request
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 dataprint(request.headers) # 請求頭中的數據3.1:request.py
from flask import Flask, render_template, request import osapp = Flask(__name__) app.config["DEBUG"] = True # 能夠隨時更改自動重啟,不加的話每次更改代碼需要手動重啟@app.route("/login", methods=["POST", "GET"]) def login():if request.method == "GET":print(request.url) # 獲取訪問路徑# request.url: http://127.0.0.1:5000/login# request.url: http://127.0.0.1:5000/login?id=1print(request.method) # 獲取請求方式# GET# GETprint(request.path) # 路由地址 /login# /login# /loginprint(request.values) # 可以獲取URL中的參數 也可以獲取 FormData中的數據# 綜合獲取 ,可以獲取url 和 formdata的數據# CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([])])# CombinedMultiDict([ImmutableMultiDict([('id', '1')]), ImmutableMultiDict([])])print(request.args)# ImmutableMultiDict([('id', '1')])print(request.args.to_dict()) # 獲取URL中的參數 轉換成 字典# {}# {'id': '1'}print(request.args.get("id")) # 獲取URL中的參數# None 沒有參數的時候就是None# 1# print(request.args["id"]) # 獲取URL中的參數# 1# 字典索引取不到值的時候 ,會出現keyerrorprint(request.environ) # 獲取請求原始信息# {'wsgi.version': (1, 0), 'wsgi.url_scheme': 'http', 'wsgi.input': <_io.BufferedReader name=1140>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.run_once': False, 'werkzeug.server.shutdown': <function WSGIRequestHandler.make_environ.<locals>.shutdown_server at 0x000001F2C1CD8378>, 'SERVER_SOFTWARE': 'Werkzeug/0.15.4', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '', 'PATH_INFO': '/login', 'QUERY_STRING': '', 'REQUEST_URI': '/login', 'RAW_URI': '/login', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': 14611, 'SERVER_NAME': '127.0.0.1', 'SERVER_PORT': '5000', 'SERVER_PROTOCOL': 'HTTP/1.1', 'HTTP_HOST': '127.0.0.1:5000', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9,en;q=0.8', 'HTTP_COOKIE': 'sessionid=wnuu61vo39ha2rnhjly8tturem306js3; csrftoken=dBlvd2yERl2dy9Oe7JoPLWer7aaOf35nx83lvoruaY0NOkl3T747KlIo5YwZ7026', 'werkzeug.request': <Request 'http://127.0.0.1:5000/login' [GET]>}print(request.base_url) # 獲取URL頭,不包含參數# http://127.0.0.1:5000/loginprint(request.json) # 毀三觀 1 請求頭中 Content-type:application/json 數據序列化 request.json# Noneprint(request.data) # 毀三觀 2 請求頭中 Content-type 不包含 Form or data# b''print(request.headers) # 請求頭中的數據# Host: 127.0.0.1:5000# Connection: keep-alive# Cache-Control: max-age=0# Upgrade-Insecure-Requests: 1# User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36# Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8# Accept-Encoding: gzip, deflate, br# Accept-Language: zh-CN,zh;q=0.9,en;q=0.8# Cookie: sessionid=wnuu61vo39ha2rnhjly8tturem306js3; csrftoken=dBlvd2yERl2dy9Oe7JoPLWer7aaOf35nx83lvoruaY0NOkl3T747KlIo5YwZ7026return render_template("login.html")if request.method == "POST":print(request.method)# POSTprint(request.form)# Multidict 多重字典,得到字典套列表套元組的類型# ImmutableMultiDict([('username', '123'), ('pwd', '456')])print(request.form.to_dict())# {'username': '123', 'pwd': '456'}print(request.values) # 可以獲取URL中的參數 也可以獲取 FormData中的數據# CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([('username', '123'), ('pwd', '456')])])print(request.values.to_dict())# {'username': '123', 'pwd': '456'}print(request.json) # 毀三觀 1 請求頭中 Content-type:application/json 數據序列化 request.json# Noneprint(request.data) # 毀三觀 2 請求頭中 Content-type 不包含 Form or data 原始請求體數據# b''print(request.headers)# Host: 127.0.0.1:5000# Connection: keep-alive# Content-Length: 235# Cache-Control: max-age=0# Origin: http://127.0.0.1:5000# Upgrade-Insecure-Requests: 1# Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1BWoxZMCbTbU3Koy# User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36# Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8# Referer: http://127.0.0.1:5000/login# Accept-Encoding: gzip, deflate, br# Accept-Language: zh-CN,zh;q=0.9,en;q=0.8# Cookie: sessionid=wnuu61vo39ha2rnhjly8tturem306js3; csrftoken=dBlvd2yERl2dy9Oe7JoPLWer7aaOf35nx83lvoruaY0NOkl3T747KlIo5YwZ7026# 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)# 獲取文件的數據print(request.files)# ImmutableMultiDict([('my_file', <FileStorage: '1.jpg' ('image/jpeg')>)])# 文件只在File 里顯示# Form中不包含print(request.files.get("my_file"))# <FileStorage: '1.jpg' ('image/jpeg')>my_file = request.files.get("my_file")# my_file.save(my_file.filename)# 保存到本地的# 可以指定路徑 用os模塊fq = os.path.join("templates", my_file.filename)my_file.save(fq)username = request.form.get("username")password = request.form["pwd"]# Get 和索引都能拿到值if username == "123" and password == "456":return "登錄成功"else:return "登錄失敗"# 如果包導入的話,if __name__下面不會執行 if __name__ == '__main__':app.run()3.2:login.html
<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title><link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.min.css"></head> <body><form action="/login" 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"> </form><script src="jquery-3.4.1.js"></script> <script></script> </body> </html>四:Jinja2和高級用法
4.Jinja2 {{}} 引用 or 執行 {%%} 邏輯語法 if else for4.1:jinja2.py
from flask import Flask, render_template,request,redirect,MarkupSTUDENT = {'name': 'Ivan', 'age': 38, 'gender': '中'}STUDENT_LIST = [{'name': 'Sail', 'age': 38, 'gender': '中'},{'name': 'Ivan', 'age': 73, 'gender': '男'},{'name': 'VS', 'age': 84, 'gender': '女'} ]STUDENT_DICT = {1: {'name': 'Sail', 'age': 38, 'gender': '中'},2: {'name': 'Ivan', 'age': 73, 'gender': '男'},3: {'name': 'VS', 'age': 84, 'gender': '女'}, }app = Flask(__name__) app.config["DEBUG"] = True@app.template_global() # 把ab函數傳到前端了 def ab(a,b):return a+b@app.route("/jija") def jija():my_in = Markup("<input type='text' name='uname'>")return render_template("jija.html",stu_info=STUDENT,stu_list=STUDENT_LIST,stu_dict=STUDENT_DICT,m=my_in)if __name__ == '__main__':app.run("127.0.0.1", 9999)4.2:jinja2.html
<!DOCTYPE html> <html lang="zh-CN"> <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><br/>{{ 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"] !="女" %}女{{ foo["gender"] }}{% endif %}</td></tr> {% endfor %} ```</table> <br/>{{ stu_dict }}<table border="1px"><tr><td>id</td><td>name</td><td>age</td><td>gender</td></tr><tr>{% for id,s in stu_dict.items() %}<td>{{ id }}</td><td>{{ s.name }}</td><td>{{ s.get("age") }}</td><td>{{ s["gender"] }}</td></tr>{% endfor %}</table><br/> {{ m }}<br/> {% macro my_input(na,ty) %}<input type="{{ ty }}" name="{{ na }}"> {% endmacro %}{{ my_input("uname","text") }} # macro 需要啟動才生產輸入框<br/> {#{{ ab(1,2) }}#}</body> </html>五:session
5.Flask中的Session 不是三方組件 //Flask-Session from flask import sessionsession 交由客戶端保管機制 # 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的加密字符串5.1:session.py
from flask import Flask, session, request, render_template, redirectapp = Flask(__name__) app.debug = True app.secret_key = "adfnaskjfnakjs"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'] = unamereturn "登陸成功"else:return "登錄失敗"@app.route("/detail") def detail():if session.get("username"):return render_template("jija.html",stu_info=STUDENT,stu_list=STUDENT_LIST,stu_dict=STUDENT_DICT, )else:return redirect("/login")if __name__ == '__main__':app.run("127.0.0.1", 9999)5.2:login.html
<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title><link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.min.css"></head> <body><form action="/login" 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"> </form><script src="jquery-3.4.1.js"></script> <script></script> </body> </html>轉載于:https://www.cnblogs.com/Quantum-World/p/11166227.html
總結
以上是生活随笔為你收集整理的Flask一:安装初始,return方式,Request,Jinja2,session的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 微信小程序开发--数据绑定
- 下一篇: 简单CSS3动画制作