Flask有兩大核心:Werkzeug和Jinja2python
Werkzeug實現路由,調試和web服務器網關接口,Werkzeug庫的routing模塊負責URL的解析,不一樣的URL對應不一樣的視圖函數.web
routing模塊內部有:正則表達式
Rule類: 用來構造不一樣的URL模式的對象,路由URL規則json
Map類: 存儲全部的URL規則和一些配置參數flask
BaseConverter的子類,負責匹配的規則服務器
MapAdapter類: 負責協調Rule作具體的匹配工做cookie
Jinja2實現模板.app
from flask import Flask函數
app = Flask(__name__)post
@app.route("/")
def hello():
return "hello world"
if __name__ == "__main__":
app.run()
Flask模塊介紹:
from flask import Flask
# __name__:會認爲該文件所在的目錄就是flask項目目錄
# static_url_path:訪問靜態文件的前綴
# static_folder: 靜態文件所在的目錄文件夾名稱
# template_folder:模板文件所在的目錄文件夾名稱
app = Flask(__name__,
static_url_path="/static",
static_folder ="static",
template_folder ="templates")
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
加載項目配置信息
from flask import Flask
# 自定義項目配置類
class Config(object):
DEBUG = True
app =Flask(__name__)
# 方式一:使用類的方式加載配置信息(重點)
app.config.from_object(Config)
# 方式二:在同級目錄中創建一個配置文件('my.ini')
app.config.from_pyfile('my.ini')
# 方式三:使用環境變量方式加載項目配置信息
# 跟方式二同樣,先寫一哥配置文件,而後將文件的路徑加入到環境變量中
# config的本質是一個字典
@app.route("/")
def hello():
# 兩種方式獲取字典的值,
# get方式獲取不到則不會報錯,默認爲空
print(app.config.get("DEBUG",""))
# 找不到會報錯
print(app.config["DEBUG"]")
return "hello world"
if __name__ == "__main__":
# 0.0.0.0表示本機全部ip都可訪問, port表明端口號
app.run(host="0.0.0.0", port = 8888, debug=True)
轉換器提取url路徑的參數
from flask import Flask
app = Flask(__name__)
@app.route("/")
def demo1():
return "hello world"
# <user_id>轉換器提取url路徑的參數
# user_id的類型默認是字符串類型
# 127.0.0.1/user/字符串類型的數據
@app("/user/<user_id>")
def demo3(user_id):
return "user_id:%s" % user_id
# 限制輸入的數據類型
# 127.0.0.1:5000/user_id/int數據類型
@app.route("/user_id/<int:user_id>")
def demo4(user_id):
return "user_id"% user_id
if __name__=="__main__"
app.run(debug=True)
請求方式:GET及POST
from flask import Flask
app = Flask(__name__)
# 不設置默認是get請求方式
@app.route("/")
def hello_world():
return "hello world"
# 設置post請求方式
@app.route("/post", methods=["POST"])
def demo():
return "post success"
if __name__ == "__main__":
print(app.url_map)
app.run(debug=True)
自定義轉換器類
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 自定義轉換器
class RegexConverter(BaseConverter):
# 重寫regex屬性,當你將正則表達式傳入給它,BaseConverter類幫你處理
# url_map,re只是參數
def __init__(self, url_map, re):
# 初始化父類
super(RegexConverter, self).__init__(url_map)
self.regex = re
# 註冊正則匹配類
# 往flask源碼裏面添加一個鍵值對
"""
往flask源碼裏面添加一個鍵值對
{
re:RegexConverter
}
"""
# 將re轉換成RegexConverter類
app.url_map.converters["re"] = RegexConverter
# re("\d{6}")-->RegexConverter(app.url_map, "\d{6}")
@app.route("/user/<re("\d{6}"):user_id>)
def demo1(user_id):
return "user %s" % user_id
if __name__ == "__main__":
app.run(debug=True)
獲取請求參數:
data: 記錄請求的數據
form: post請求中的表單數據
args: get請求中的參數
cookies: 記錄請求中的cookie信息
headers: 記錄請求中的報文頭
method: 記錄請求使用的http請求方法
url: 記錄請求的URL地址
files:記錄請求上傳的文件
from flask import Flask, request
# 默認請求時get請求,127.0.0.1:5000/get?user_name=kangkang&age=18
@app.route("/get")
def demo1():
"""提取get請求號後面攜帶的參數"""
#request.method屬性獲取訪問方式,後面的請求方式必須大寫
if request.method == "GET":
user_name = request.args.get("user_name", "")
age = request.args.get("age")
return "%s %s" %(user_name, age)
else:
return "請求方式錯誤405!"
# post請求提取參數
# 須要指明請求方式爲POST
@app.route("/post", methods = ['POST'])
def demo2():
if request.method == "POST":
user_name = request.form.get("user_name", "")
age = request.form.get("age", "")
return "%s %s"%(user_name, user_id)
else:
return "405請求方式錯誤"
# 文件上傳
@app.route("/upload", methods=["POST"])
def demo3():
if request.method == "POST":
file = request.files.get("pic", "")
# 將圖片保存到服務器本地
file.save("./1.png")
else:
return "405請求方式錯誤"
if __name__ == "__main__":
app.run(debug=True)
注意點:
GET:獲取服務器的數據,問號裏面攜帶的參數,告知服務器我要什麼類型的數據
POST:往服務器新增數據,請求體裏面攜帶參數,通常是須要存入的數據
構造響應數據:
import json
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def demo1():
# json數據轉換
dict = {
"name":"kangkang",
"age":24,
"info":{
"team":"laker"
}
}
# 序列化,將python對象轉化成json字符串
json_str = json.dumps(dict)
# 反序列化:將json字符串轉換成python對象
my_dict = json.loads(json_str)
# jsonify:可以將python對象轉換成json對象
# 可以將響應體數據封裝成響應對象並返回
# 指明瞭響應數據的格式:ContentType = "application/json"
my_json = jsonify(dict)
return my_json
if __name__ == "__main__":
app.run(debug=True)
重定向
from flask import Flask, redirect, url_for
# redirect:重定向,輸入指定的路徑會跳轉到指定的地址
# url_for("要重定向的函數名稱","參數值")
app = Flask(__name__)
@app.route("/index/<int:user_id>")
def hello(user_id):
return "hello %d" user_id
@app.route("/demo2")
def demo2():
# 重定向到百度
return redirect("www.baidu.com)
@app.route("/demo3")
def demo3():
# 重定向到指定的函數
# url_for:反向解析函數
# 傳入的函數名稱--->解析對應的url,根據app.app_url就能返回對應的url
return redirect(url_for('hello', user_id = 6666))
if __name__ == "__main__":
app.run(debug=True)