日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Flask知识点回顾以及重点内容

發(fā)布時(shí)間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask知识点回顾以及重点内容 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.?HTTP通信與Web框架

1.1 流程

客戶端將請(qǐng)求打包成HTTP的請(qǐng)求報(bào)文(HTTP協(xié)議格式的請(qǐng)求數(shù)據(jù))

采用TCP傳輸發(fā)送給服務(wù)器端

服務(wù)器接收到請(qǐng)求報(bào)文后按照HTTP協(xié)議進(jìn)行解析

服務(wù)器根據(jù)解析后獲知的客戶端請(qǐng)求進(jìn)行邏輯執(zhí)行

服務(wù)器將執(zhí)行后的結(jié)果封裝成HTTP的響應(yīng)報(bào)文(HTTP協(xié)議格式的響應(yīng)數(shù)據(jù))

采用剛才的TCP連接將響應(yīng)報(bào)文發(fā)送給客戶端

客戶端按照HTTP協(xié)議解析響應(yīng)報(bào)文獲取結(jié)果數(shù)據(jù)

1.2 細(xì)節(jié)

客戶端不一定是瀏覽器,也可以是PC軟件、手機(jī)APP、程序

根據(jù)服務(wù)器端的工作,將其分為兩部分:

服務(wù)器:與客戶端進(jìn)行tcp通信,接收、解析、打包、發(fā)送http格式數(shù)據(jù)

業(yè)務(wù)程序:根據(jù)解析后的請(qǐng)求數(shù)據(jù)執(zhí)行邏輯處理,形成要返回的數(shù)據(jù)交給服務(wù)器

服務(wù)器與Python業(yè)務(wù)程序的配合使用WSGI協(xié)議

1.3 Web框架

能夠被服務(wù)器調(diào)用起來(lái),根據(jù)客戶端的不同請(qǐng)求執(zhí)行不同的邏輯處理形成要返回的數(shù)據(jù)的 程序

?

核心:實(shí)現(xiàn)路由和視圖(業(yè)務(wù)邏輯處理)

?

1.4 框架的輕重

重量級(jí)的框架:為方便業(yè)務(wù)程序的開(kāi)發(fā),提供了豐富的工具、組件,如Django

?

輕量級(jí)的框架:只提供Web框架的核心功能,自由、靈活、高度定制,如FlaskTornado

webpy

?

1.5 明確Web開(kāi)發(fā)的任務(wù)

視圖開(kāi)發(fā):根據(jù)客戶端請(qǐng)求實(shí)現(xiàn)業(yè)務(wù)邏輯(視圖)編寫(xiě)

模板、數(shù)據(jù)庫(kù)等其他的都是為了幫助視圖開(kāi)發(fā),不是必備的

?

2.?認(rèn)識(shí)Flask

2.1 簡(jiǎn)介

Flask誕生于2010年,是Armin ronacher(人名)用Python語(yǔ)言基于Werkzeug工具箱編寫(xiě)的輕量級(jí)Web開(kāi)發(fā)框架。它主要面向需求簡(jiǎn)單的小應(yīng)用。

?

Flask本身相當(dāng)于一個(gè)內(nèi)核,其他幾乎所有的功能都要用到擴(kuò)展(郵件擴(kuò)展Flask-Mail,用戶認(rèn)證Flask-Login),都需要用第三方的擴(kuò)展來(lái)實(shí)現(xiàn)。比如可以用Flask-extension加入ORM、窗體驗(yàn)證工具,文件上傳、身份驗(yàn)證等。Flask沒(méi)有默認(rèn)使用的數(shù)據(jù)庫(kù),你可以選擇MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模塊) ,模板引擎則使用 Jinja2

?

可以說(shuō)Flask框架的核心就是WerkzeugJinja2

?

Python最出名的框架要數(shù)Django,此外還有FlaskTornado等框架。雖然Flask不是最出名的框架,但是Flask應(yīng)該算是最靈活的框架之一,這也是Flask受到廣大開(kāi)發(fā)者喜愛(ài)的原因。

2.2 與Django對(duì)比

django提供了:

django-admin快速創(chuàng)建項(xiàng)目工程目錄

manage.py 管理項(xiàng)目工程

orm模型(數(shù)據(jù)庫(kù)抽象層)

admin后臺(tái)管理站點(diǎn)

緩存機(jī)制

文件存儲(chǔ)系統(tǒng)

用戶認(rèn)證系統(tǒng)

?

而這些,flask都沒(méi)有,都需要擴(kuò)展包來(lái)提供

2.3 Flask擴(kuò)展包:

Flask-SQLalchemy:操作數(shù)據(jù)庫(kù);

Flask-migrate:管理遷移數(shù)據(jù)庫(kù);

Flask-Mail:郵件;

Flask-WTF:表單;

Flask-script:插入腳本;

Flask-Login:認(rèn)證用戶狀態(tài);

Flask-RESTful:開(kāi)發(fā)REST API的工具;

Flask-Bootstrap:集成前端Twitter Bootstrap框架;

Flask-Moment:本地化日期和時(shí)間;

2.4 Flask文檔

中文文檔: http://docs.jinkan.org/docs/flask/

英文文檔: http://flask.pocoo.org/docs/0.11/

3.?創(chuàng)建虛擬環(huán)境

虛擬環(huán)境是一個(gè)互相隔離的目錄

1.?mkvirtualenv flask_py2

2.?pip install flask==0.10.1

?

pip freeze > requirements.txt

pip install –r requirements.txt

4.?FlaskHello world程序

# coding:utf-8

?

# 導(dǎo)入Flask

from flask import Flask

?

#Flask類接收一個(gè)參數(shù)__name__

app = Flask(__name__)

?

# 裝飾器的作用是將路由映射到視圖函數(shù)index

@app.route('/')

def index():

????return 'Hello World'

?

# Flask應(yīng)用程序?qū)嵗?/span>run方法啟動(dòng)WEB服務(wù)器

if __name__ == '__main__':

????app.run()

?

4.1 Flask創(chuàng)建app對(duì)象

4.1.1 初始化參數(shù)

import_name: 導(dǎo)入路徑(尋找靜態(tài)目錄與模板目錄位置的參數(shù))

static_url_path:

static_folder: 默認(rèn)‘static’

template_folder: 默認(rèn)‘templates’

4.1.2 配置參數(shù)

app.config.from_pyfile(“yourconfig.cfg”)

app.config.from_object()

app.config[“DEBUG”] = True

4.1.3 在視圖讀取配置參數(shù)

app.config.get() ?或者 current_app.config.get()

4.1.4 app.run的參數(shù)

app.run(host=”0.0.0.0”, port=5000, debug=True)

4.2 路由

4.2.1 app.url_map 查看所有路由

?

4.2.2 同一路由裝飾多個(gè)視圖函數(shù)

?

4.2.3 同一視圖多個(gè)路由裝飾器

?

4.2.4 利用methods限制訪問(wèn)方式

@app.route('/sample', methods=['GET', 'POST'])

4.2.5 使用url_for進(jìn)行反解析

?

4.2.5 動(dòng)態(tài)路由

# 路由傳遞的參數(shù)默認(rèn)當(dāng)做string處理,這里指定int,尖括號(hào)中冒號(hào)后面的內(nèi)容是動(dòng)態(tài)的

@app.route('/user/<int:id>')

def hello_itcast(id):

????return 'hello itcast %d' %id

?

4.2.5 自定義轉(zhuǎn)換器

from flask import Flask

from werkzeug.routing import BaseConverter

?

class Regex_url(BaseConverter):

????def __init__(self,url_map,*args):

????????super(Regex_url,self).__init__(url_map)

????????self.regex = args[0]

?

app = Flask(__name__)

app.url_map.converters['re'] = Regex_url

?

@app.route('/user/<re("[a-z]{3}"):id>')

def hello_itcast(id):

????return 'hello %s' %id

4.3 獲取請(qǐng)求參數(shù)

from flask import request

?

就是 Flask 中表示當(dāng)前請(qǐng)求的 request 對(duì)象,request對(duì)象中保存了一次HTTP請(qǐng)求的一切信息。

?

4.3.1 上傳文件

已上傳的文件存儲(chǔ)在內(nèi)存或是文件系統(tǒng)中一個(gè)臨時(shí)的位置。你可以通過(guò)請(qǐng)求對(duì)象的 files 屬性訪問(wèn)它們。每個(gè)上傳的文件都會(huì)存儲(chǔ)在這個(gè)字典里。它表現(xiàn)近乎為一個(gè)標(biāo)準(zhǔn)的 Python file 對(duì)象,但它還有一個(gè) save() 方法,這個(gè)方法允許你把文件保存到服務(wù)器的文件系統(tǒng)上。這里是一個(gè)用它保存文件的例子:

?

from flask import request

?

@app.route('/upload', methods=['GET', 'POST'])

def upload_file():

????if request.method == 'POST':

????????f = request.files['the_file']

????????f.save('/var/www/uploads/uploaded_file.txt')

????...

如果你想知道上傳前文件在客戶端的文件名是什么,你可以訪問(wèn) filename 屬性。但請(qǐng)記住, 永遠(yuǎn)不要信任這個(gè)值,這個(gè)值是可以偽造的。如果你要把文件按客戶端提供的文件名存儲(chǔ)在服務(wù)器上,那么請(qǐng)把它傳遞給 Werkzeug 提供的 secure_filename() 函數(shù):

from flask import request

from werkzeug import secure_filename

?

@app.route('/upload', methods=['GET', 'POST'])

def upload_file():

????if request.method == 'POST':

????????f = request.files['the_file']

????????f.save('/var/www/uploads/' + secure_filename(f.filename))

????...

4.4 abort函數(shù)與自定義異常處理

4.4.1 abort函數(shù)

from flask import abort

abort(404)

4.4.2 自定義異常處理

@app.errorhandler(404)

def error(e):

????return '您請(qǐng)求的頁(yè)面不存在了,請(qǐng)確認(rèn)后再次訪問(wèn)!%s'%e

?

4.5 返回的響應(yīng)數(shù)據(jù)

4.5.1 元組

可以返回一個(gè)元組,這樣的元組必須是 (response, status, headers)?的形式,且至少包含一個(gè)元素。 status 值會(huì)覆蓋狀態(tài)代碼, headers 可以是一個(gè)列表或字典,作為額外的消息標(biāo)頭值。[(key, value),()] ??{“key”:”value”,…}

?

4.5.2 make_response

resp = make_response(“”)

resp.headers[“sample”] =?“value”

resp.status = “404 not found”

?

4.6 使用jsonify返回json數(shù)據(jù)

json.dumps() ?json.loads()

jsonify(key=value, k1=v1)

4.5 重定向

from flask import redirect

?

4.6 設(shè)置和讀取cookie

resp = make_response()

?

resp.set_cookie(key, value=’’, max_age=None)

?

resp.delete_cookie(key)

?

request.cookies.get()

4.7 session

from flask import session

?

需要設(shè)置secret_key

?

session[key] = val

value = session.get(key)

?

4.8 請(qǐng)求上下文與應(yīng)用上下文

?

請(qǐng)求上下文(request context)??

requestsession都屬于請(qǐng)求上下文對(duì)象。

?

應(yīng)用上下文(application context)

current_appg都屬于應(yīng)用上下文對(duì)象。

?

current_app:表示當(dāng)前運(yùn)行程序文件的程序?qū)嵗?/span>

g:處理請(qǐng)求時(shí),用于臨時(shí)存儲(chǔ)的對(duì)象,每次請(qǐng)求都會(huì)重設(shè)這個(gè)變量。

?

4.9 請(qǐng)求鉤子 hook

請(qǐng)求鉤子是通過(guò)裝飾器的形式實(shí)現(xiàn),Flask支持如下四種請(qǐng)求鉤子:

?

before_first_request:在處理第一個(gè)請(qǐng)求前運(yùn)行。

?

@app.before_first_request

?

before_request:在每次請(qǐng)求前運(yùn)行。

?

after_request(response):如果沒(méi)有未處理的異常拋出,在每次請(qǐng)求后運(yùn)行。

?

teardown_request(response):在每次請(qǐng)求后運(yùn)行,即使有未處理的異常拋出。

?

5.?Flask-Script擴(kuò)展命令行

pip install Flask-Script

?

runserver –h ip地址 –p端口號(hào)

shell

?

from flask import Flask

from flask_script import Manager

?

app = Flask(__name__)

?

manager = Manager(app)

?

@app.route('/')

def index():

????return '床前明月光'

?

if __name__ == "__main__":

????manager.run() ???...

6.?Jinja2模板

6.1 基本流程

<!DOCTYPE html>

<html lang="en">

<head>

????<meta charset="UTF-8">

????<title>Template</title>

</head>

<body>

????<h1>hello {{ name }}</h1>

</body>

</html>

?

@app.route("/")

def index():

????return render_template("index.html", name="python",…)

?

使用flask 中的render_template渲染模板

6.2 變量

<p>{{mydict['key']}}</p>

?

<p>{{mydict.key}}</p>

?

<p>{{mylist[1]}}</p>

?

<p>{{mylist[myvariable]}}</p>


from flask import Flask,render_template

app = Flask(__name__)

?

@app.route('/')

def index():

????mydict = {'key':'silence is gold'}

????mylist = ['Speech', 'is','silver']

????myintvar = 0

?

????return render_template('vars.html',

???????????????????????????mydict=mydict,

???????????????????????????mylist=mylist,

???????????????????????????myintvar=myintvar

???????????????????????????)

if __name__ == '__main__':

????app.run(debug=True)


6.3 過(guò)濾器

6.3.1 字符串過(guò)濾器

safe:禁用轉(zhuǎn)義;

??<p>{{ '<em>hello</em>' | safe }}</p>

?

capitalize:把變量值的首字母轉(zhuǎn)成大寫(xiě),其余字母轉(zhuǎn)小寫(xiě);

??<p>{{ 'hello' | capitalize }}</p>

?

lower:把值轉(zhuǎn)成小寫(xiě);

??<p>{{ 'HELLO' | lower }}</p>

?

upper:把值轉(zhuǎn)成大寫(xiě);

??<p>{{ 'hello' | upper }}</p>

?

title:把值中的每個(gè)單詞的首字母都轉(zhuǎn)成大寫(xiě);

??<p>{{ 'hello' | title }}</p>

?

trim:把值的首尾空格去掉;

??<p>{{ ' hello world ' | trim }}</p>

?

reverse:字符串反轉(zhuǎn);

??<p>{{ 'olleh' | reverse }}</p>

?

format:格式化輸出;

??<p>{{ '%s is %d' | format('name',17) }}</p>

?

striptags:渲染之前把值中所有的HTML標(biāo)簽都刪掉;

??<p>{{ '<em>hello</em>' | striptags }}</p>

?

6.3.2 支持鏈?zhǔn)绞褂眠^(guò)濾器

<p>{{ “?hello world ?“?| trim | upper }}</p>

6.3.3 列表過(guò)濾器

first:取第一個(gè)元素

??<p>{{ [1,2,3,4,5,6] | first }}</p>

?

last:取最后一個(gè)元素

??<p>{{ [1,2,3,4,5,6] | last }}</p>

?

length:獲取列表長(zhǎng)度

??<p>{{ [1,2,3,4,5,6] | length }}</p>

?

sum:列表求和

??<p>{{ [1,2,3,4,5,6] | sum }}</p>

?

sort:列表排序

??<p>{{ [6,2,3,1,5,4] | sort }}</p>

?

6.3.4 自定義過(guò)濾器

自定義的過(guò)濾器名稱如果和內(nèi)置的過(guò)濾器重名,會(huì)覆蓋內(nèi)置的過(guò)濾器。

?

方式一:

通過(guò) add_template_filter (過(guò)濾器函數(shù), 模板中使用的過(guò)濾器名字)

def filter_double_sort(ls):

????return ls[::2]

app.add_template_filter(filter_double_sort,'double_2')

?

方式二:

通過(guò)裝飾器 ?app.template_filter (模板中使用的裝飾器名字)

@app.template_filter('db3')

def filter_double_sort(ls):

????return ls[::-3]

6.4 表單

使用Flask-WTF表單擴(kuò)展,可以幫助進(jìn)行CSRF驗(yàn)證,幫助我們快速定義表單模板,而且可以幫助我們?cè)谝晥D中驗(yàn)證表的數(shù)據(jù)

?

pip install Flask-WTF

6.4.1 不使用Flask-WTF擴(kuò)展時(shí),表單需要自己處理

#模板文件

<form method='post'>

????<input type="text" name="username" placeholder='Username'>

<input type="password" name="password" placeholder='password'>

????<input type="submit">

</form>


from flask import Flask,render_template,request

?

@app.route('/login',methods=['GET','POST'])

def login():

????if request.method == 'POST':

????????username = request.form['username']

????????password = request.form['password']

????????print username,password

???? return “success”

else:

return render_template(“l(fā)ogin.html”)


6.4.2 使用Flask-WTF擴(kuò)展

需要設(shè)置 SECRET_KEY 的配置參數(shù)

?

模板頁(yè):

<form method="post">

????????#設(shè)置csrf_token

????????{{ form.csrf_token() }}

????????{{ form.us.label }}

????????<p>{{ form.us }}</p>

????????{{ form.ps.label }}

????????<p>{{ form.ps }}</p>

????????{{ form.ps2.label }}

????????<p>{{ form.ps2 }}</p>

????????<p>{{ form.submit() }}</p>

????????{% for x in get_flashed_messages() %}

????????????{{ x }}

????????{% endfor %}

?</form>

?

視圖函數(shù)

#coding=utf-8

from flask import Flask,render_template, redirect,url_for,session,request,flash

?

#導(dǎo)入wtf擴(kuò)展的表單類

from flask_wtf import FlaskForm

#導(dǎo)入自定義表單需要的字段

from wtforms import SubmitField,StringField,PasswordField

#導(dǎo)入wtf擴(kuò)展提供的表單驗(yàn)證器

from wtforms.validators import DataRequired,EqualTo

app = Flask(__name__)

app.config['SECRET_KEY']='1'

?

#自定義表單類,文本字段、密碼字段、提交按鈕

class Login(Flask Form):

????us = StringField(label=u'用戶:',validators=[DataRequired()])

????ps = PasswordField(label=u'密碼',validators=[DataRequired(),EqualTo('ps2','err')])

????ps2 = PasswordField(label=u'確認(rèn)密碼',validators=[DataRequired()])

????submit = SubmitField(u'提交')

?

#定義根路由視圖函數(shù),生成表單對(duì)象,獲取表單數(shù)據(jù),進(jìn)行表單數(shù)據(jù)驗(yàn)證

@app.route('/',methods=['GET','POST'])

def index():

????form = Login()

????if form.validate_on_submit():

????????name = form.us.data

????????pswd = form.ps.data

????????pswd2 = form.ps2.data

????????print name,pswd,pswd2

????????return redirect(url_for('login'))

????else:

????????if request.method=='POST':

flash(u'信息有誤,請(qǐng)重新輸入!')

?

????return render_template('index.html',form=form)

if __name__ == '__main__':

????app.run(debug=True)

?

6.5 控制語(yǔ)句

6.5.1 if語(yǔ)句

{% if %} {% endif %}

6.5.2 for語(yǔ)句

{% for item in samples %} {% endfor %}

?

6.6 宏

類似于python中的函數(shù),宏的作用就是在模板中重復(fù)利用代碼,避免代碼冗余。

?

6.6.1 不帶參數(shù)宏的定義與使用

定義:

{% macro input() %}

??<input type="text"

?????????name="username"

?????????value=""

?????????size="30"/>

{% endmacro %}

?

使用

{{ input() }}

?

6.6.2 帶參數(shù)宏的定義與使用

定義

{% macro input(name,value='',type='text',size=20) %}

????<input type="{{ type }}"

???????????name="{{ name }}"

???????????value="{{ value }}"

???????????size="{{ size }}"/>

{% endmacro %}

?

使用

{{ input(value='name',type='password',size=40)}}

?

6.6.3 將宏單獨(dú)封裝在html文件中

?

文件名可以自定義macro.html

?

{% macro input() %}

?

????<input type="text" name="username" placeholde="Username">

????<input type="password" name="password" placeholde="Password">

????<input type="submit">

{% endmacro %}

?

在其它模板文件中先導(dǎo)入,再調(diào)用

?

{% import 'macro.html' as func %}

{{ func.input() }}

?

6.4 模板繼承

extend

6.5 模板包含

include

?

6.6 flask在模板中使用特殊變量和方法

6.6.1 config

?

6.6.2 request

?

6.6.3 url_for

?

?

總結(jié)

以上是生活随笔為你收集整理的Flask知识点回顾以及重点内容的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。