亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

flask入門(mén)1

Freelander / 991人閱讀

摘要:每天的內(nèi)容跑起來(lái)模板引擎表單文件上傳郵件發(fā)送一框架的簡(jiǎn)介模型負(fù)責(zé)數(shù)據(jù)的操作視圖負(fù)責(zé)數(shù)據(jù)的展示控制器控制你的的操作以及視圖模板的渲染在中叫做模型負(fù)責(zé)數(shù)據(jù)的操作控制你的的操作以及視圖模板的渲染業(yè)務(wù)邏輯的操作模板負(fù)責(zé)數(shù)據(jù)的展示二架構(gòu)三概念是

flask

每天的內(nèi)容

flask跑起來(lái)

模板引擎

flask表單

文件上傳郵件發(fā)送

flask-sqlalchemy

一、web框架的簡(jiǎn)介

M 模型 負(fù)責(zé)數(shù)據(jù)的操作

V 視圖 負(fù)責(zé)數(shù)據(jù)的展示

C 控制器 控制你的M的操作以及視圖模板的渲染

在python中叫做MVT

M 模型 負(fù)責(zé)數(shù)據(jù)的操作

V 控制你的M的操作以及視圖模板的渲染 業(yè)務(wù)邏輯的操作

T templates 模板 負(fù)責(zé)數(shù)據(jù)的展示

二、架構(gòu)

BS browser-》server

CS client-》server

三、FLASK

概念: flask是一個(gè)非常小的web框架 被稱為微型框架 只提供了一個(gè)強(qiáng)健的核心 其它的都是通過(guò)第三方擴(kuò)展庫(kù)來(lái)實(shí)現(xiàn)

組成

調(diào)試 路由 WSGI

模板引擎 jinja2 (就是由flask核心人員開(kāi)發(fā)的模板引擎)

使用:

安裝 pip install flask

實(shí)例
from flask import Flask

app = Flask(__name__) #實(shí)例化flask

#路由地址 根據(jù)用戶不同的url進(jìn)行處理
@app.route("/")
def index():#處理當(dāng)前請(qǐng)求的函數(shù)
    return "Hello Flask"

if __name__ == "__main__":
    app.run() #運(yùn)行當(dāng)前的flask
四、視圖函數(shù) (1) 無(wú)參路由
#路由地址和視圖函數(shù)名稱 是否同名沒(méi)有關(guān)系
#http://127.0.0.1:5000/test/
@app.route("/test/") #路由地址末尾的/建議加上
def test():
    return "我是測(cè)試使用的視圖函數(shù)"
(2) 帶一個(gè)參數(shù)的路由

http://127.0.0.1:5000/page/10/

@app.route("/page//") #參數(shù)的語(yǔ)法格式 /路由名稱/<形參名>/
def page(pagenum):
    return "當(dāng)前的頁(yè)碼為{}".format(pagenum)
(3) 帶多個(gè)參數(shù)
#帶多個(gè)參數(shù)
# http://127.0.0.1:5000/arg/10/zhansgan/
@app.route("/arg///")
def getarg(age,name):
    return "我叫{} 我見(jiàn)年{}歲了".format(name,age)
# http://127.0.0.1:5000/arg/zhansgan_10/
@app.route("/arg/_/")
def getarg(age,name):
    return "我叫{} 我見(jiàn)年{}歲了".format(name,age)
(4) 限制參數(shù)的類型
#參數(shù)類型
# @app.route("/argtype//")
# @app.route("/argtype//") #限定參數(shù)類型為int
# @app.route("/argtype//") #限定參數(shù)類型為float
# @app.route("/argtype//") #限定參數(shù)類型為string 默認(rèn)就是字符串
@app.route("/argtype//") #其實(shí)path就是string 但是path會(huì)將路由地址后面的所有的路由或者值都認(rèn)為是一個(gè)值 /不在作為分隔符來(lái)使用
def argtype(arg):
    print(type(arg))
    print(arg)
    return "獲取參數(shù)類型的視圖函數(shù)"

注意

路由地址末尾的/建議加上 因?yàn)槿绻斎氲臅r(shí)候沒(méi)有加默認(rèn)的/瀏覽器會(huì)自動(dòng)幫你加上

形參名字寫(xiě)在路由的<> 中間

參數(shù)默認(rèn)類型都為string

?

五、視圖函數(shù)的響應(yīng) (1) return 字符串進(jìn)行響應(yīng)
@app.route("/response/")
def res():
    return "我是響應(yīng)",404 #響應(yīng)一個(gè)指定標(biāo)準(zhǔn)的狀態(tài)碼
(2) 通過(guò)make_response構(gòu)造響應(yīng)
導(dǎo)入:

from flask import make_response

@app.route("/make_response/")
def makeResponse():
    res = make_response("我是響應(yīng)的內(nèi)容")
    # res = make_response("我是響應(yīng)的內(nèi)容",404)
    return res
六、重定向 redirect

作用: 從一個(gè)地址跳向另外一個(gè)地址

導(dǎo)入

from flask import redirect

實(shí)例

@app.route("/")
def index():#處理當(dāng)前請(qǐng)求的函數(shù)
    return "Hello Flask"

#重定向
@app.route("/redirect/")
def redirect_index():
    return redirect("/") #參數(shù)為路由地址
    return redirect("/argtype/redirect_index/") #帶參數(shù)路由地址的重定向
url_for 通過(guò)視圖函數(shù)名稱 反向構(gòu)造出路由地址

導(dǎo)入

from flask import redirect,url_for

實(shí)例

@app.route("/redirect/")
def redirect_index():
    url = url_for("test")
    url = url_for("getarg",name="zhangsan",age=18) #帶多個(gè)參數(shù)
      #@app.route("/arg/_/")
      #def getarg(age,name):
    return url #/test/

注意:

如果給定的視圖函數(shù)名稱不存在 則拋出異常

url_for 和 redirect 組合使用
@app.route("/redirect/")
def redirect_index():
    return redirect(url_for("test"))
    return redirect(url_for("getarg",name="zhangsan",age=18)) #帶多個(gè)參數(shù)
七、abort 終止

概念:

在視圖函數(shù)中處理的時(shí)候 可以使用abort拋出指定狀態(tài)碼的錯(cuò)誤 下面代碼不在執(zhí)行

需要拋出標(biāo)準(zhǔn)http的狀態(tài)碼

from flask import abort

實(shí)例

@app.route("/abort/")
def my_abort():
    # abort(404)
    # abort(500)
    return "拋出狀態(tài)碼"
#捕獲500的錯(cuò)誤
@app.errorhandler(500)
def server_error(e):
    return "現(xiàn)在能看到了嗎{}".format(e)

#捕獲404的錯(cuò)誤信息
@app.errorhandler(404)
def server_error(e):
    return "您訪問(wèn)的頁(yè)面被外星人劫持走了?。?!"
八、app.run() 參數(shù)說(shuō)明
參數(shù) 參數(shù)說(shuō)明 默認(rèn)值
host 主機(jī)名 127.0.0.1
port 端口號(hào) 5000
debug 調(diào)試 False
threaded 多線程 False

實(shí)例

if __name__ == "__main__":
    # app.run(debug=True) #開(kāi)啟調(diào)試模式
    app.run(host="0.0.0.0",port=5001,debug=True,threaded=True)
十、請(qǐng)求 request

說(shuō)明:

request是由flask框架為我們提供好的對(duì)象 使用時(shí) 只要導(dǎo)入即可

用戶在請(qǐng)求的時(shí)候 框架會(huì)為當(dāng)前請(qǐng)求的用戶 創(chuàng)建一個(gè)request(請(qǐng)求的對(duì)象) 包含當(dāng)前用戶請(qǐng)求的所有信息

導(dǎo)入

from flask import request

url 用戶請(qǐng)求的完整的url

base_url 去除get傳參后的url

host_url 只有主機(jī)和端口號(hào)的url

path 獲取請(qǐng)求的路由地址

method 請(qǐng)求的方法

args 獲取get傳參

form 獲取表單傳遞過(guò)來(lái)的數(shù)據(jù)

files 獲取文件上傳過(guò)來(lái)的數(shù)據(jù)

headers 獲取用戶請(qǐng)求過(guò)來(lái)的頭信息

cookies 獲取用戶請(qǐng)求過(guò)來(lái)的所有cookie

json 獲取用戶請(qǐng)求過(guò)來(lái)的json數(shù)據(jù)

實(shí)例

@app.route("/request/")
def get_request():
    print("用戶請(qǐng)求的完整的url",request.url)
    print("去除get傳參后的url",request.base_url)
    print("只有主機(jī)和端口號(hào)的url",request.host_url)
    print("獲取請(qǐng)求的路由地址",request.path)
    print(" 請(qǐng)求的方法",request.method)
    print("獲取拼湊的get傳參",request.args)
    print("獲取拼湊的get傳參",request.args.get("name"))
    print("獲取拼湊的get傳參",request.args.get("age"))
    print("獲取表單傳遞過(guò)來(lái)的數(shù)據(jù)",request.form)
    print("獲取文件上傳過(guò)來(lái)的數(shù)據(jù)",request.files)
    print("獲取用戶請(qǐng)求過(guò)來(lái)的頭信息",request.headers)
    print("獲取用戶請(qǐng)求過(guò)來(lái)的所有cookie",request.cookies)
    print("獲取用戶請(qǐng)求過(guò)來(lái)的json數(shù)據(jù)",request.json)
    return "request對(duì)象"
十一、會(huì)話控制 cookie和session

cookie

設(shè)置cookie
response.set_cookie(
    key,  #設(shè)置鍵
    value,#設(shè)置值
    max_age=None, #過(guò)期時(shí)間
    path = "/" #當(dāng)前cookie的存儲(chǔ)路徑
)
獲取cookie
@app.route("/get_cookie/")
def get_cookie():
    print(request.cookies)
    return request.cookies.get("name","default默認(rèn)值")
刪除cookie
#清除cookie
@app.route("/del_cookie/")
def del_cookie():
    res = make_response("清除cookie")
    res.delete_cookie("name")
    return res

cookie存儲(chǔ)值為明文存儲(chǔ) 安全性低

cookie存在客戶端(瀏覽器中)

cookie默認(rèn)存活時(shí)間為 當(dāng)前瀏覽結(jié)束(關(guān)閉當(dāng)前的瀏覽器)

session

session的使用 需要一個(gè)secret_key 來(lái)進(jìn)行加密產(chǎn)生加密的字符串

app.config["SECRET_KEY"] = "secretkey"

會(huì)給cookie設(shè)置一個(gè)唯一的標(biāo)識(shí)符 sessionId 服務(wù)器端會(huì)通過(guò)cookie攜帶著唯一的sessionId來(lái)區(qū)分是哪一個(gè)用戶的請(qǐng)求 如果客戶端的cookie被禁用了 那么服務(wù)器端的session將無(wú)法使用 session基于cookie

設(shè)置session
#設(shè)置session
@app.route("/set_session/")
def set_session():
     默認(rèn)存活當(dāng)前瀏覽器結(jié)束
    session["username"] = "張三"
    return "設(shè)置session"
設(shè)置session 及過(guò)期時(shí)間
#設(shè)置session
@app.route("/set_session/")
def set_session():
    session.permanent = True #設(shè)置session持久化存儲(chǔ)
    #設(shè)置當(dāng)前session的存活時(shí)間60秒 如果當(dāng)前設(shè)置失敗 那么存活時(shí)間為1月
    app.permanent_session_lifetime = timedelta(seconds=60)
    session["username"] = "張三"
    return "設(shè)置session"
獲取session
#獲取session
@app.route("/get_session/")
def get_session():
    return session.get("username","default默認(rèn)值")
刪除session
@app.route("/del_session/")
def del_session():
    #刪除 key為username的session
    session.pop("username")
    #刪除所有session
    # session.clear()
    return "刪除session"
十二、flask-script擴(kuò)展

簡(jiǎn)介:

就是一個(gè)flask終端運(yùn)行的解析器 通過(guò)不同參數(shù) 來(lái)設(shè)置flask的啟動(dòng)項(xiàng)

安裝

sudo pip3 install flask-script

使用

from flask_script import Manager #導(dǎo)入終端運(yùn)行的解析器
app = Flask(__name__)
manager = Manager(app)
...
if __name__ == "__main__":
    manager.run()
啟動(dòng)參數(shù)
-h 主機(jī)
-p 端口號(hào)
-d 調(diào)試
-r 重新加載
-threaded 多線程
python manage.py runserver -h

python manage.py runserver -h0.0.0.0 -p5000 -d -r --threaded

python manage.py runserver -d -r

十三、藍(lán)本藍(lán)圖 Blueprint

概述

當(dāng)所有代碼越愛(ài)越多的時(shí)候 在manage.py中 很明顯是不合理的 我們需要將不同功能的視圖函數(shù) 存放在不同的文件中 使用我們的項(xiàng)目的目錄結(jié)構(gòu)更加的清晰

使用

user.py 用戶的處理
from flask import Blueprint

user = Blueprint("user",__name__)

@user.route("/login/")
def login():
    return "登錄"
manage.py中
from mysession import mysession
from user import user
#http://127.0.0.1:5000/login/
app.register_blueprint(user) #注冊(cè)藍(lán)本
#http://127.0.0.1:5000/user/login/
app.register_blueprint(user,url_prefix="/user") #注冊(cè)藍(lán)本并添加前綴
藍(lán)本中的重定向
@app.route("/")
def index():
    # return "首頁(yè)"
    return redirect("/user/login/")
    return redirect(url_for("user.login")) #使用url_for反向構(gòu)造出路由的時(shí)候 需要指定當(dāng)前的視圖函數(shù) 是哪一個(gè)藍(lán)本對(duì)象的
十四、請(qǐng)求鉤子函數(shù)

在manage文件中使用

鉤子函數(shù) 功能描述
before_first_request 第一次請(qǐng)求之前
before_request 每次請(qǐng)求之前
after_request 每次請(qǐng)求之后 沒(méi)有異常
teardown_request 每次請(qǐng)求之后 即使有異常出現(xiàn)

實(shí)例

@app.before_first_request
def before_first_request():
    print("before_first_request")

@app.before_request
def before_request():
    print("before_request")
    if request.method == "GET" and request.path == "/form/":
        abort(500)

@app.after_request
def before_request(r):
    print("before_request",r)
    return r

@app.teardown_request
def teardown_request(r):
    print("teardown_request")
    return r
在藍(lán)本中使用
鉤子函數(shù) 功能描述
before_app_first_request 第一次請(qǐng)求之前
before_app_request 每次請(qǐng)求之前
after_app_request 每次請(qǐng)求之后 沒(méi)有異常
teardown_app_request 每次請(qǐng)求之后 即使有異常出現(xiàn)

實(shí)例

@user.before_app_first_request
def before_first_request():
    print("before_first_request")

@user.before_app_request
def before_request():
    print("before_request")
    if request.method == "GET" and request.path == "/form/":
        abort(500)

@user.after_app_request
def after_request(r):
    print("after_request",r)
    return r

@user.teardown_app_request
def teardown_request(r):
    print("teardown_request")
    return r

注意:

鉤子函數(shù)寫(xiě)在藍(lán)本或者啟動(dòng)文件中 都可以捕獲到所有的請(qǐng)求和響應(yīng)(一樣)一個(gè)flask中只需要寫(xiě)一個(gè)鉤子函數(shù)而不需要重復(fù)寫(xiě)鉤子函數(shù)

flask入門(mén)2-模板引擎

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41831.html

相關(guān)文章

  • flask入門(mén)4-文件上傳與郵件發(fā)送

    摘要:文件上傳郵件發(fā)送一原生文件上傳修改頭像提交文件上傳的視圖函數(shù)有文件上傳了拿到文件名稱圖片上傳保存的路徑使用和渲染文件上傳自定義一個(gè)文件上傳的表單類修改頭像文件不能為空該文件類型不允許上傳提交生成隨機(jī)的圖片名稱獲取圖片大小設(shè)置尺寸當(dāng)前縮放 文件上傳郵件發(fā)送 一、原生文件上傳 form.html 修改頭像 manage.py...

    vvpale 評(píng)論0 收藏0
  • Flask二之快速入門(mén)

    摘要:一一個(gè)最小的應(yīng)用是程序?qū)嵗?,一個(gè)項(xiàng)目只能有一個(gè)程序?qū)嵗酚裳b飾器視圖函數(shù)返回一個(gè)字符串把程序保存為用解釋器運(yùn)行訪問(wèn),會(huì)看見(jiàn)問(wèn)候。路由裝飾器這個(gè)函數(shù)的返回值稱為響應(yīng),是客戶端接收到的內(nèi)容。 一.一個(gè)最小的Flask應(yīng)用 from flask import Flask app = Flask(__name__) #app是程序?qū)嵗?,一個(gè)項(xiàng)目只能有一個(gè)程序?qū)嵗?@app.route(/) #...

    XGBCCC 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<