目錄html
request.headres 之 請求頭中數據顯示:前端
print(type(request.headers)) """ Host: 127.0.0.1:5000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://127.0.0.1:5000/home Content-Type: application/x-www-form-urlencoded Content-Length: 26 Cookie: csrftoken=vDIozqveCEfArdYXlM6goHVlSQEn7h4bDygNphL2Feas60DiM2di0jlqKfxo7xhA Connection: keep-alive Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 """
request.data 之 若是處理不了的就變成字符串兒存在data裏面python
request 是基於 mimetype 進行處理的json
mimetype的類型 以及 字符串兒 : http://www.w3school.com.cn/media/media_mimeref.aspflask
若是不屬於上述類型的描述,request就會將沒法處理的參數轉爲Json存入到 data 中後端
其實咱們能夠將 request.data , json.loads 一樣能夠拿到裏面的參數cookie
其餘request參數:session
request.獲取各類路徑之這些方法不必記,可是要知道它存在 # 獲取當前的url路徑 print(request.path)# /req # 當前url路徑的上一級路徑 print(request.script_root) # # 當前url的所有路徑 print(request.url) # http://127.0.0.1:5000/req # 當前url的路徑的上一級所有路徑 print(request.url_root ) # http://127.0.0.1:5000/
request.json 數據在提交數據時,須要指定參數的格式是json格式app
若是在請求中寫入了 "application/json" 使用 request.json 則返回json解析數據, 不然返回 None函數
Flask中的session是flask自帶的模塊
session生成機制:先建立一個字典,再secret_key + 時間戳 + flask內置簽名 加密 造成
實例:
from datetime import timedelta from flask import Flask, session, request, render_template, redirect app = Flask(__name__) # 隨機建立一個session的key app.secret_key = "#$%^&*#$%^&#$%2213123^&" # 調試模式 app.debug = True # 更改session的名字 app.session_cookie_name = "I am Not Session" # 設置session的過時時間,15秒 # app.permanent_session_lifetime = 15 @app.route("/login", methods=["POST", "GET"]) def login(): if request.method == "GET": return render_template("login.html") else: uname = request.form.get("username") pwd = request.form.get("pwd") if uname == "123" and pwd == "123": # 設置session session["username"] = uname return "200 OK" else: return "登陸失敗!" @app.route("/detail") def detail(): # 驗證session設置是否成功 if session.get("username"): return render_template("index.html") else: return redirect("/login") if __name__ == '__main__': app.run("0.0.0.0", 9527)
HTML文件:
... <form action="" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="username"> 密碼:<input type="password" name="pwd"> <input type="submit" value="提交"> </form> ...
falsk模板語法是基於jinja2語法實現
from flask import Flask, render_template 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.route("/index") def index(): return render_template("index1.html", stu_info=STUDENT, stu_list=STUDENT_LIST, sd=STUDENT_DICT) if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 9527)
HTML文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {# 普通字典數據處理 #} {{ stu_info }} <table border="1ps"> <tr> <td>name</td> <td>age</td> <td>gender</td> </tr> <tr> <td>{{ stu_info.name }}</td> <td>{{ stu_info.age }}</td> <td>{{ stu_info.gender }}</td> </tr> </table> {# 列表中嵌套字典數據的處理 #} <hr> {{ stu_list }} <table border="1ps"> <tr> <td>name</td> <td>age</td> <td>gender</td> </tr> {% for foo in stu_list %} <tr> <td>{{ foo.name }}</td> <td>{{ foo.age }}</td> {% if foo.gender != "男" and foo.gender != "女" %} <td>女</td> {% else %} <td>{{ foo.gender }}</td> {% endif %} </tr> {% endfor %} </table> {# 字典數據類型處理 #} <hr> {{ sd }} <table border="1ps"> <tr> <td>name</td> <td>age</td> <td>gender</td> </tr> {% for k,v in sd.items() %} <tr> <td>{{ v.name }}</td> <td>{{ v.age }}</td> <td>{{ v.gender }}</td> </tr> {% endfor %} </table> </body> </html>
經過定義全局變量的方法,不須要導入則能夠直接在模板中使用:
from flask import Flask, render_template #裝飾自定義方法 app = Flask(__name__) app.debug = True # 自定義方法,這裏裝飾的函數是一個全局變量 @app.template_global() def ab(a, b): return a + b @app.template_filter() # 定義全局模板函數 def a_b_c_sum(a, b, c): return a + b + c @app.route("/index") def index(): return render_template("index1.html") if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 9527)
HTML文件:輸出結果3
... <body> <h3>自定義的方法ab</h3> 輸出結果:{{ ab(1,2) }} <br> {{ 1 | a_b_c_sum(197,2) }} </body> </html>
後端建立一個字符串標籤,經過Markup指定字符串是一個標籤,不然前端則會顯示一個字符串
from flask import Flask, render_template, Markup app = Flask(__name__) app.debug = True @app.route("/index") def index(): # Markup標籤轉義,字符串轉換成標籤 my_in = Markup("<input type='text' name='uname'>") return render_template("index1.html", m=my_in) if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 9527)
HTML文件:
... <body> <hr>經過後端代碼建立一個標籤: 輸入框:{{ m }} </body> </html>
from flask import Flask, render_template app = Flask(__name__) app.debug = True @app.route("/index") def index(): my_in = "<input type='text' name='uname'>" return render_template("index1.html", m=my_in) if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 9527)
HTML文件:
... <body> <hr>經過前端過濾器建立一個標籤: 輸入框:{{ m | safe }} </body> </html>
from flask import Flask, render_template app = Flask(__name__) app.debug = True @app.route("/index") def index(): return render_template("index1.html") if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 9527)
HTML文件:
mscro是直接在前端實現標籤的建立,目前有點雞肋,沒什麼用處
... <body> <hr>經過macro方式建立一個標籤: {% macro my_input(na, ny) %} <input type="{{ ny }}" name="{{ na }}"> {% endmacro %} 輸入框:{{ my_input("uname", "type") }} </body> </html>
若是咱們前端頁面有大量重複頁面,不必每次都寫,可使用模板複用的方式複用模板
前端代碼:
index.html 文件中的內容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>下面的內容是不同的</h2> {% block content %} {% endblock %} <h2>上面的內容是不同的,可是下面的內容是同樣的</h2> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Welcome OldboyEDU</h1> <h2>下面的內容是不同的</h2> {% block content %} {% endblock %} <h2>上面的內容是不同的,可是下面的內容是同樣的</h2> <h1>OldboyEDU is Good</h1> </body> </html>
login.html 文件中的內容
{% extends "index.html" %} {% block content %} <form> 用戶名:<input type="text" name="user"> 密碼:<input type="text" name="pwd"> </form> {% endblock %}
{% extends "index.html" %} {% block content %} <form> 用戶名:<input type="text" name="user"> 密碼:<input type="text" name="pwd"> </form> {% endblock %}
後端代碼:
from flask import Flask from flask import render_template app = Flask(__name__) @app.route("/login") def login(): return render_template("login.html") @app.route("/home") def home(): return render_template("home.html") app.run("0.0.0.0", 5000, debug=True)
include模板語法:就是將 login.html 當成一個模塊,加載到 index.html 頁面中
login.html 文件中的內容:
<form> 用戶名:<input type="text" name="user"> 密碼:<input type="text" name="pwd"> </form>
index.html 文件中的內容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Welcome</h1> <h2>下面的內容是不同的</h2> {% include "login.html" %} <h2>上面的內容是不同的,可是下面的內容是同樣的</h2> </body> </html>
後端代碼:
from flask import Flask from flask import render_template app = Flask(__name__) @app.route("/") def index(): return render_template("index.html") app.run("0.0.0.0", 5000, debug=True)