一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 使用Python的Flask框架來搭建第一個Web應(yīng)用程序

使用Python的Flask框架來搭建第一個Web應(yīng)用程序

2020-08-25 09:39ipython Python

Flask框架是一個以輕量級著稱的Web開發(fā)框架,近兩年來在Web領(lǐng)域獲得了極高的人氣,這里我們就來看如何使用Python的Flask框架來搭建第一個Web應(yīng)用程序

1、初始化
在這章,你將學(xué)到Flask應(yīng)用程序的不同部分。同時,你將編寫和運(yùn)行你的第一個Flask web應(yīng)用程序。

所有的Flask應(yīng)用程序都必須創(chuàng)建一個 應(yīng)用程序?qū)嵗?。使用web服務(wù)器網(wǎng)關(guān)接口協(xié)議將所有從客戶端接收的請求傳遞給這個對象處理。這個應(yīng)用程序?qū)嵗褪荈lask類的一個對象,通常使用下面的方式創(chuàng)建:

?
1
2
from flask import Flask
app = Flask(__name__)

Flask類構(gòu)造函數(shù)唯一需要的參數(shù)就是應(yīng)用程序的主模塊或包。對于大多數(shù)應(yīng)用程序,Python的__name__變量就是那個正確的、你需要傳遞的值。

注:對于Flask開發(fā)者來說,傳給Flask應(yīng)用程序構(gòu)造函數(shù)的name參數(shù)是比較容易弄混淆的。Flask使用這個參數(shù)來確定應(yīng)用程序的根目錄,這樣以后可以相對這個路徑來找到資源文件。
稍后你可以看到更復(fù)雜的應(yīng)用程序?qū)嵗跏蓟?,但是對于簡單?yīng)用程序這些已經(jīng)足夠了。

2、路由和視圖函數(shù)
客戶端例如web瀏覽器發(fā)送 請求 給web服務(wù),進(jìn)而將它們發(fā)送給Flask應(yīng)用程序?qū)嵗?yīng)用程序?qū)嵗枰缹τ诟鱾€URL請求需要運(yùn)行哪些代碼,所以它給Python函數(shù)建立了一個URLs映射。這些在URL和函數(shù)之間建立聯(lián)系的操作被稱之為 路由 。

在Flask應(yīng)程序中定義路由的最便捷的方式是通過顯示定義在應(yīng)用程序?qū)嵗系腶pp.route裝飾器,注冊被裝飾的函數(shù)來作為一個路由。下面的例子會演示怎樣使用裝飾器來申明一個路由:

?
1
2
3
@app.route('/')
def index():
 return '<h1>Hello World!</h1>'

注:裝飾器是Python語言的標(biāo)準(zhǔn)特性;它們可以以不同方式改變函數(shù)的行為。一個常見的模式是使用裝飾器來注冊函數(shù)作為一個事件處理程序。
在上一個示例給應(yīng)用程序的根URL注冊index()函數(shù)作為事件的處理程序。如果這個應(yīng)用程序被部署在服務(wù)器上并綁定了 www.example.com 域名,然后在你的瀏覽器地址欄中輸入 http://www.example.com 將觸發(fā)index()來運(yùn)行服務(wù)。客戶端接收到的這個函數(shù)的返回值被稱為 響應(yīng) 。如果客戶端是web瀏覽器,響應(yīng)則是顯示給用戶的文檔。

類似于index()的函數(shù)被稱作 視圖函數(shù) 。通過視圖返回的響應(yīng)可以是簡單的HTML內(nèi)容的字符串,但它也可以市更復(fù)雜的形式,正如您將看到的。

注:響應(yīng)字符串嵌入在Python代碼中導(dǎo)致代碼難以掌控,在此只是介紹響應(yīng)的概念。你將在第三章學(xué)習(xí)正確的方法來生成響應(yīng)。
如果你注意到你每天使用的一些網(wǎng)站URLs如何形成的,你將會發(fā)現(xiàn)很多都有變量。例如,你的Facebook個人信息頁的URL是 http://www.facebook.com/<username> ,所以你的用戶名是它的一部分。Flask在路由裝飾器中使用特殊的語法支持這些類型的URLs。下面的示例定義了一個擁有動態(tài)名稱組件的路由:

?
1
2
3
@app.route('/user/<name>')
def user(name):
 return '<h1>Hello, %s!</h1>' % name

用尖括號括起來的部分是動態(tài)的部分,所以任何URLs匹配到靜態(tài)部分都將映射到這個路由。當(dāng)視圖函數(shù)被調(diào)用,F(xiàn)lask發(fā)送動態(tài)組件作為一個參數(shù)。在前面的示例的視圖函數(shù)中,這個參數(shù)是用于生成一個個性的問候作為響應(yīng)。

在路由中動態(tài)組件默認(rèn)為字符串,但是可以定義為其他類型。例如,路由/user/<int:id>只匹配有一個整數(shù)在id動態(tài)段的URLs。Flask路由支持int、float和path。path同樣是字符串類型,但并不認(rèn)為斜杠是分隔符,而認(rèn)為它們是動態(tài)組件的一部分。

3、服務(wù)啟動
應(yīng)用程序?qū)嵗幸粋€run方法用于啟動Flask集成的web服務(wù):

?
1
2
if __name__ == '__main__':
 app.run(debug=True)

__name__ == '__main__'在此處使用是用于確保web服務(wù)已經(jīng)啟動當(dāng)腳本被立即執(zhí)行。當(dāng)腳本被另一個腳本導(dǎo)入,它被看做父腳本將啟動不同的服務(wù),所以app.run()調(diào)用會被跳過。

一旦服務(wù)啟動,它將進(jìn)入循環(huán)等待請求并為之服務(wù)。這個循環(huán)持續(xù)到應(yīng)用程序停止,例如通過按下Ctrl-C。

有幾個選項參數(shù)可以給app.run()配置web服務(wù)的操作模式。在開發(fā)期間,可以很方便的開啟debug模式,將激活 debugger 和 reloader 。這樣做是通過傳遞debug為True來實現(xiàn)的。

注:Flask提供的web服務(wù)并不用于生產(chǎn)環(huán)境。你將在十七章學(xué)習(xí)生產(chǎn)環(huán)境的web服務(wù)。

4、一個完整的應(yīng)用程序
在上一節(jié),你學(xué)習(xí)了Flask web應(yīng)用程序的不同部分,現(xiàn)在是時候?qū)懸粋€了。整個 hello.py 應(yīng)用程序腳本只不過將前面描述的三個部分結(jié)合在一個文件中。應(yīng)用程序示例2-1所示。

示例 hello.py:一個完整的Flask應(yīng)用程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def index():
 return '
 
<h1>Hello World!</h1>
 
'
 
if __name__ == '__main__':
 app.run(debug=True)

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行g(shù)it checkout 2a來切換到這個版本的應(yīng)用程序。
運(yùn)行應(yīng)用程序之前,請確保你在之前創(chuàng)建的虛擬環(huán)境已經(jīng)是激活狀態(tài)且已安裝Flask?,F(xiàn)在打開你的web瀏覽器并在地址欄輸入 http://127.0.0.1:5000/ 。下圖顯示連接到應(yīng)用程序后的web瀏覽器。

使用Python的Flask框架來搭建第一個Web應(yīng)用程序

然后輸入以下命令啟動應(yīng)用程序:

?
1
2
3
(venv) $ python hello.py
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader

如果你輸入任何其他URL,應(yīng)用程序?qū)⒉恢廊绾尾僮魉⑶覍⒎祷劐e誤代碼404給瀏覽器——當(dāng)你訪問一個不存在的網(wǎng)頁也會得到該錯誤。

下面所示應(yīng)用程序的增強(qiáng)版添加了第二個動態(tài)路由。當(dāng)你訪問這個URI,你應(yīng)該可以看到一個個性的問候。

示例hello.py:帶有動態(tài)路由的Flask應(yīng)用程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def index():
 return '
 
<h1>Hello World!</h1>
 
'
 
@app.route('/user/<name>')
def user(name):
 return '
 
<h1>Hello, %s!</h1>
 
' % name
 
if __name__ == '__main__':
 app.run(debug=True)

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行g(shù)it checkout 2b來切換到這個版本的應(yīng)用程序。
測試動態(tài)路由,確保服務(wù)正在運(yùn)行隨后訪問 http://localhost:5000/user/Dave 。生成的應(yīng)用程序會使用動態(tài)參數(shù)名響應(yīng)一個定制的問候。嘗試不同的名稱,看看視圖函數(shù)總是生成響應(yīng)基于給定的名稱。

使用Python的Flask框架來搭建第一個Web應(yīng)用程序

 

5、請求-響應(yīng)循環(huán)
現(xiàn)在你已經(jīng)玩過一個基本的Flask應(yīng)用程序,你也許想要知道更多關(guān)于Flask如何施展魔力。下面章節(jié)描述了一些框架設(shè)計方面的特點(diǎn)。

5.1、應(yīng)用程序Context和請求Context

當(dāng)Flask從客戶端收到一個請求,它需要提供幾個可用對象給視圖函數(shù)處理。request對象是個不錯的例子,它封裝了客戶端發(fā)送的HTTP請求。

Flask視圖函數(shù)訪問request對象的最好方式,就是作為一個參數(shù)發(fā)送它,但這需要每個單一視圖函數(shù)在應(yīng)用程序中有一個額外的參數(shù)??紤]一下,如果request對象不是唯一一個視圖函數(shù)需要訪問完成請求的對象,事情將會變得更加復(fù)雜。

為了避免弄亂視圖函數(shù)那些可能需要或不需要的參數(shù),F(xiàn)lask使用context來臨時確定可訪問的全局對象。也多虧了context,視圖函數(shù)可以寫成下面這樣:

?
1
2
3
4
5
6
7
8
9
10
from flask import request
 
@app.route('/')
def index():
 user_agent = request.headers.get('User-Agent')
 return '
 
<p>Your browser is %s</p>
 
' % user_agent

注意,在這個視圖函數(shù)中,request是如何被作為一個全局變量來使用的?,F(xiàn)實中,request是不能作為全局變量的,如果是多線程服務(wù)器,同一時間線程作用于不同客戶端的不同請求,所以每一個線程需要看到request中的不同對象。contexts使得Flask確定可訪問的全局變量而不干擾其他線程。

注:線程是可以獨(dú)立管理的最小指令序列。一個進(jìn)程中有多個活動的線程是非常常見的,有時分享內(nèi)存或文件句柄資源。多線程web服務(wù)器會啟動一個線程池并從池中選擇一個線程來處理每個傳入的請求。
Flask有兩類context:應(yīng)用級context 和 請求級context。表2-1展示了這些context提供的變量。

使用Python的Flask框架來搭建第一個Web應(yīng)用程序

 

Flask激活(或壓棧)應(yīng)用級context和請求級context在調(diào)度請求之前,然后刪除他們當(dāng)請求被處理后。當(dāng)應(yīng)用程序context被壓入棧,線程中current_app和g變量變得可用;同樣的,當(dāng)請求級context被壓入棧,request和session變量也同樣變得可用。如果這些變量中的任何一個不是由激活的應(yīng)用級或請求級context訪問,會產(chǎn)生錯誤。在后面的章節(jié)會詳細(xì)討論四個context變量,所以不要擔(dān)心你不理解它們的用處。

下面的Python shell會話演示了應(yīng)用級context是如何工作的:

?
1
2
3
4
5
6
7
8
9
10
11
>>> from hello import app
>>> from flask import current_app
>>> current_app.name
Traceback (most recent call last):
...
RuntimeError: working outside of the application context
>>> app_ctx = app.app_context()
>>> app_ctx.push()
>>> current_app.name
'hello'
>>> app_ctx.pop()

在這個示例中,當(dāng)應(yīng)用級context沒有激活,但是卻作為有效的context被壓入棧中,current_app.name報錯。注意在應(yīng)用程序?qū)嵗幸粋€應(yīng)用級context是如何通過調(diào)用app.app_context()來獲得的。

5.2、請求調(diào)度

當(dāng)一個應(yīng)用程序收到客戶端的請求,它需要找到響應(yīng)的視圖函數(shù)為之服務(wù)。對于這個任務(wù),F(xiàn)lask會在應(yīng)用程序的URL映射中查找請求的URL,該映射包含URLs和操作它們的視圖函數(shù)。Flask通過app.route裝飾器或非裝飾器版本app.add_url_rule()來建立這個映射。

看一下Flask應(yīng)用程序中URL映射是怎樣的,你可以在Python shell中檢查hello.py創(chuàng)建的映射。測試中,請確保你的虛擬環(huán)境是激活狀態(tài):

?
1
2
3
4
5
6
(venv) % python
>>> from hello import app
>>> app.url_map
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
 <Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])

/和/user/<name>路由是由應(yīng)用程序中的app.route所定義。/static/<filename>路由是由Flask添加,用于訪問靜態(tài)文件的一個特殊路由。你將在第三章學(xué)習(xí)更多關(guān)于靜態(tài)文件的內(nèi)容。

URL映射中所示的HEAD、OPTIONS、GET元素為request方法,由路由處理。Flask連接方法到每個路由,這樣不同的請求方法發(fā)送到相同的URL可以被不同的視圖函數(shù)處理。HEAD和OPTIONS方法由Flask自動管理,所以實際上可以說,在這個應(yīng)用程序中URL映射的三個路由都連接到GET方法了。在第四章你將學(xué)習(xí)為路由指定不同的請求方法。

5.3、請求Hooks

有些時候在每個請求處理之前或之后執(zhí)行代碼是非常有用的。例如,在開始每一個請求前可能有必要創(chuàng)建數(shù)據(jù)庫連接,或?qū)τ脩粽埱筮M(jìn)行驗證。為了避免復(fù)制處理這些操作的代碼到每一個視圖函數(shù)中,F(xiàn)lask給你選擇注冊相同函數(shù)來調(diào)用,在請求被分配給視圖函數(shù)之前或之后。

請求hooks由裝飾器實現(xiàn)。下面是四個Flask支持的hooks:

(1)before_first_request:在第一個請求被處理前注冊一個函數(shù)運(yùn)行。
(2)before_request:在每一個請求前注冊一個函數(shù)運(yùn)行。
(3)after_request:如果沒有未處理的異常發(fā)生,在每一個請求后注冊一個函數(shù)運(yùn)行。
(4)teardown_request:即使未處理的異常發(fā)生,在每一個請求后注冊一個函數(shù)運(yùn)行。
在請求hook函數(shù)和視圖函數(shù)之間共享數(shù)據(jù)的慣用方法就是使用g全局context。例如,before_request處理程序可以從數(shù)據(jù)庫加載已登錄的用戶并保存在g.user中。之后,當(dāng)視圖函數(shù)被調(diào)用,可以從那訪問用戶。

請求hooks的示例會在未來的章節(jié)中展示給大家,所以不用擔(dān)心,

5.4、響應(yīng)

當(dāng)Flask調(diào)用一個視圖函數(shù),并期望它的返回值去響應(yīng)該請求。大多數(shù)的響應(yīng)是將簡單字符串構(gòu)成的HTML頁面發(fā)回給客戶端。

但是HTTP協(xié)議需要比字符串更多的信息作為請求的響應(yīng)。一個HTTP響應(yīng)中非常重要的部分是狀態(tài)碼,F(xiàn)lask默認(rèn)設(shè)置200來指示請求已經(jīng)成功處理。

當(dāng)視圖函數(shù)需要用不同的狀態(tài)碼響應(yīng),可以在響應(yīng)文本后添加數(shù)字碼作為第二個返回值。例如,下面的視圖函數(shù)返回400錯誤狀態(tài)碼的請求:

?
1
2
3
@app.route('/')
def index():
 return '<h1>Bad Request</h1>', 400

視圖函數(shù)返回的響應(yīng)還可以攜帶第三個參數(shù),添加一個頭部字典給HTTP響應(yīng)。通常很少用到,但是你可以在第十四章看到示例。

除了返回一個、兩個或三個值的元組,F(xiàn)lask視圖函數(shù)可以選擇返回response對象。make_response()函數(shù)可攜帶一個、兩個或三個參數(shù),和視圖函數(shù)返回的值一樣,并返回一個response對象。有時候在視圖函數(shù)中執(zhí)行這個轉(zhuǎn)換是非常有用的,然后使用response對象中的方法進(jìn)一步配置響應(yīng)。下面的示例創(chuàng)建response對象并設(shè)置cookie:

?
1
2
3
4
5
6
7
8
9
10
11
from flask import make_response
 
@app.route('/')
def index():
 response = make_response('
 
<h1>This document carries a cookie!</h1>
 
')
 response.set_cookie('answer', '42')
 return response

有一類特殊的響應(yīng)稱作重定向。這類響應(yīng)不包含頁面文檔;只是給瀏覽器一個新的URL去加載新的頁面。重定向通常和web表單一起使用,你將在第四章學(xué)習(xí)。

重定向通常由302響應(yīng)狀態(tài)碼注明并且重定向的URL由頭部的Location給出。重定向響應(yīng)可以使用三個值的返回生成,也可通過響應(yīng)對象生成,但是鑒于它頻繁的使用,F(xiàn)lask提供redirect()函數(shù)來創(chuàng)建這樣的響應(yīng):

?
1
2
3
4
5
from flask import redirect
 
@app.route('/')
def index():
 return redirect('http://www.example.com')

另一個具有中斷功能的特殊響應(yīng)用來錯誤處理。下面的示例,當(dāng)URL給出的id動態(tài)參數(shù)不是一個合法的用戶時返回狀態(tài)碼404:

?
1
2
3
4
5
6
7
8
9
10
11
12
from flask import abort
 
@app.route('/user/<id>')
def get_user(id):
 user = load_user(id)
 if not user:
  abort(404)
 return '
 
<h1>Hello, %s</h1>
 
' % user.name

注意終止不是指將控制權(quán)返回給調(diào)用它的函數(shù),而是指通過拋出異常將控制權(quán)返回給web服務(wù)。

6、Flask擴(kuò)展
Flask是可擴(kuò)展的。它故意騰出地給重要的功能,例如數(shù)據(jù)庫和用戶授權(quán),給你自由去選擇最適合你的應(yīng)用程序的包,或?qū)懸粋€自己想要的。

社區(qū)開發(fā)了非常多的擴(kuò)展用于各種用途,如果這還不夠,可以使用任何Python標(biāo)準(zhǔn)包和庫。為了讓你了解一個擴(kuò)展是如何并入一個應(yīng)用程序的,下面的章節(jié)給hello.py添加一個擴(kuò)展,增加應(yīng)用程序的命令行參數(shù)。

6.1、Flask-Script命令行選項

Flask開發(fā),其web服務(wù)器支持一系列的啟動配置選項,但是配置它們的唯一方式只有在腳本中傳遞參數(shù)給app.run()并調(diào)用。這不是非常的方便,理想方法是通過命令行參數(shù)傳遞配置選項。

Flask-Script是給你的Flask應(yīng)用程序添加命令行解釋的擴(kuò)展。它打包了一組通用的選項,還支持自定義命令。

使用pip安裝擴(kuò)展:

?
1
(venv) $ pip install flask-script

下面展示了在 hello.py 應(yīng)用程序中添加命令行解釋的變化。
示例. hello.py:使用Flask-Script

?
1
2
3
4
5
6
7
8
from flask.ext.script import Manager
 
manager = Manager(app)
 
# ...
 
if __name__ == '__main__':
 manager.run()

專為Flask開發(fā)的擴(kuò)展暴露在flask.ext命名空間下。Flask-Script從flask.ext.script中導(dǎo)出一個名為Manager的類。

初始化這個擴(kuò)展的方法和其他許多擴(kuò)展一樣:主類實例的初始化是通過將應(yīng)用程序?qū)嵗鳛閰?shù)傳遞給構(gòu)造函數(shù)實現(xiàn)的。創(chuàng)建的對象適當(dāng)?shù)挠糜诿恳粋€擴(kuò)展。在這個示例中,服務(wù)器啟動通過manager.run()來路由,且命令行在這被解析。

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行g(shù)it checkout 2c來切換到這個版本的應(yīng)用程序。
因為這些變化,應(yīng)用程序獲得一組基本的命令行選項。運(yùn)行hello.py顯示可用信息:

?
1
$ python hello.py
?
1
2
3
4
5
6
7
8
9
usage: hello.py [-h] {shell, runserver} ...
 
positional arguments:
 {shell, runserver}
 shell   在Flask應(yīng)用程序上下文的內(nèi)部運(yùn)行一個Python Shell。
 runserver  運(yùn)行Flask開發(fā)服務(wù)器,例如:app.run()
 
optional arguments:
 -h, --help  顯示這個幫助信息并退出

shell命令用于在應(yīng)用程序上下文中啟動一個Python shell會話。你可以使用這個會話去運(yùn)行維護(hù)任務(wù),或測試,或調(diào)試錯誤。

runserver命令,就像它的名稱一樣,啟動web服務(wù)。運(yùn)行python hello.py runserver在調(diào)試模式下啟動web服務(wù),還有更多的選項:

?
1
2
3
4
(venv) $ python hello.py runserver --help
usage: hello.py runserver [-h] [-t HOST] [-p PORT] [--threaded]
       [--processes PROCESSES] [--passthrough-errors] [-d]
       [-r]

運(yùn)行Flask開發(fā)服務(wù)器,例如:app.run()

?
1
2
3
4
5
6
7
8
9
optional arguments:
 -h, --help    顯示這個幫助信息并退出
 -t HOST, --host HOST
 -p PORT, --port PORT
 --threaded
 --processes PROCESSES
 --passthrough-errors
 -d, --no-debug
 -r, --no-reload

--host參數(shù)是一個非常有用的選項,因為它能告訴web服務(wù)器監(jiān)聽哪個網(wǎng)絡(luò)接口的客戶端連接。默認(rèn),F(xiàn)lask開發(fā)的web服務(wù)器監(jiān)聽localhost的連接,所以只有來自內(nèi)部計算機(jī)運(yùn)行的服務(wù)器可以接收。下面的命令使得web服務(wù)器監(jiān)聽公網(wǎng)接口,其他網(wǎng)絡(luò)上的計算機(jī)可以連接:

?
1
2
3
(venv) $ python hello.py runserver --host 0.0.0.0
 * Running on http://0.0.0.0:5000/
 * Restarting with reload

現(xiàn)在web服務(wù)器應(yīng)該可以從網(wǎng)絡(luò)中的任何一臺計算機(jī)訪問 http://a.b.c.d:5000 ,“a.b.c.d”是運(yùn)行服務(wù)的計算機(jī)的外部IP地址。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产欧美在线人成 | 草溜短视频| 国产免费又粗又猛又爽视频国产 | 国内精品视频免费观看 | 狠狠干综合网 | 双子母性本能在线观看 | 欧美三级不卡在线观线看高清 | 欧美高清在线不卡免费观看 | 男女视频在线观看 | 网站色小妹 | 青青久久久国产线免观 | 九九热视频免费观看 | 免费抽搐一进一出印度 | 嫩交18xxxx | 亚洲毛片基地4455ww | 日本嫩小xxxxhd | 毛片一区二区三区提莫影院 | 国产极品精频在线观看 | ai换脸杨颖被啪在线观看 | 亚洲欧美日韩天堂在线观看 | 红楼影视h38bar在线线播放 | 亚洲国产日韩成人综合天堂 | gogo人体模特啪啪季玥图片 | 欧美成人精品第一区二区三区 | 欧美成人乱弄视频 | 欧美整片完整片视频在线 | 色偷偷影院 | 成人黄色a级片 | porno日本大学生高清 | 精精国产xxxx视频在线播放器 | 天美传媒传媒免费观看 | 微拍秒拍99福利精品小视频 | 黑人巨大和日本娇小中出 | 69pao强力打造免费高速 | 日本不卡在线视频高清免费 | 扒开大腿狠狠挺进视频 | 国产福利不卡视频在免费 | 日韩福利网 | 精品久久久久久 | 欧美精品v日韩精品v国产精品 | 国产午夜免费不卡精品理论片 |