精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從零開始搭建論壇(二):Web服務器網關接口

開發 前端
在 從零開始搭建論壇(一):Web服務器與Web框架 中我們弄清楚了Web 服務器、Web 應用程序、Web框架的概念。對于 Python 來說,越來越多的 Web 框架面世,在給我們更多選擇機會的同時,也限制了我們對于 Web Server 的選擇。

 【引自selfboot的博客】在 從零開始搭建論壇(一):Web服務器與Web框架 中我們弄清楚了Web 服務器、Web 應用程序、Web框架的概念。對于 Python 來說,越來越多的 Web 框架面世,在給我們更多選擇機會的同時,也限制了我們對于 Web Server 的選擇。同樣是有著很多 Web 框架的Java,因為有著 servlet API 的存在,任何Java Web框架寫的應用程序都可以運行在任意一個 Web Server 上。

Python 社區當然也需要這樣一套 API,來適配Web服務器和應用程序,這套 API 就是 WSGI(Python Web Server Gateway Interface),在 PEP 3333 里有詳細的說明。簡單來說,WSGI是連接Web服務器和Web應用程序的橋梁,一方面從Web server 拿到原始 HTTP 數據,處理成統一格式后交給 Web 應用程序,另一方面從應用程序/框架這邊進行業務邏輯處理,生成響應內容后交給服務器。

Web服務器和框架通過 WSGI 來進行耦合的詳細過程如下圖所示:

 WSGI Server 適配

具體解釋如下:

  • 應用程序(網絡框架)提供一個命名為application的可調用對象(WSGI協議并沒有指定如何實現這個對象)。
  • 服務器每次從HTTP客戶端接收請求之后,調用可調用對象application,調用時傳遞一個名叫environ的字典作為參數,以及一個名為start_response的可調用對象。
  • 框架/應用生成HTTP狀態碼以及HTTP響應報頭,然后將二者傳遞至start_response,等待服務器保存。此外,框架/應用還將返回響應的正文。
  • 服務器將狀態碼、響應報頭和響應正文組合成HTTP響應,并返回給客戶端(這一步并不屬于WSGI協議)。

下面分別從服務器端和應用程序端來看看 WSGI 是如何做適配的。

服務器端

我們知道客戶端(通常是瀏覽器)發出的每個HTTP請求由請求行、消息報頭、請求正文三部分組成,里面包含了本次請求的相關細節內容。比如:

  • Method:指出在由Request-URI標識的資源上所執行的方法,包括GET,POST 等
  • User-Agent:允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器;

服務器從客戶端接收HTTP請求之后,WSGI 接口必須要對這些請求字段進行統一化處理,方便傳給應用服務器接口(其實就是給框架)。Web服務器具體傳遞哪些數據給應用程序,早在CGI(Common Gateway Interface,通用網關接口)里就有詳細規定,這些數據被叫做 CGI 環境變量。WSGI 沿用了 CGI 環境變量的內容,要求 Web 服務器必須創建一個字典用來保存這些環境變量(一般將其命名為 environ)。除了 CGI 定義的變量,environ 還必須保存一些WSGI定義的變量,此外還可以保存一些客戶端系統的環境變量,可以參考environ Variables 來看看具體有哪些變量。

接著 WSGI 接口必須將 environ 交給應用程序去處理,這里 WSGI 規定應用程序提供一個可調用對象 application,然后服務器去調用 application,獲得返回值為HTTP響應正文。服務器在調用 application 的時候,需要提供兩個變量,一個是前面提到的變量字典environ,另一個是可調用對象 start_response,它產生狀態碼和響應頭,這樣我們就得到了一個完整的HTTP響應。Web 服務器將響應返回給客戶端,一次完整的HTTP請求-響應過程就完成了。

wsgiref 分析

Python 中內置了一個實現了WSGI接口的 Web 服務器,在模塊wsgiref中,它是用純Python編寫的WSGI服務器的參考實現,我們一起來簡單分析一下它的實現。首先假設我們用下面代碼啟動一個 Web 服務器:

  1. # Instantiate the server 
  2. httpd = make_server( 
  3.     'localhost',    # The host name 
  4.     8051,           # A port number where to wait for the request 
  5.     application     # The application object namein this case a function 
  6. # Wait for a single request, serve it and quit 
  7. httpd.handle_request()  

然后我們以Web服務器接收一個請求、生成 environ,然后調用 application 來處理請求這條主線來分析源碼的調用過程,簡化如下圖所示:

 WSGI Server 調用流程

這里主要有三個類,WSGIServer,WSGIRequestHandler,ServerHandle。WSGIServer 是Web服務器類,可以提供server_address(IP:Port)和 WSGIRequestHandler 類來進行初始化獲得一個server對象。該對象監聽響應的端口,收到HTTP請求后通過 finish_request 創建一個RequestHandler 類的實例,在該實例的初始化過程中會生成一個 Handle 類實例,然后調用其 run(application) 函數,在該函數里面再調用應用程序提供的 application對象來生成響應。

這三個類的繼承關系如下圖所示:

 WSGI 類繼承關系圖

其中 TCPServer 使用 socket 來完成 TCP 通信,HTTPServer 則是用來做 HTTP 層面的處理。同樣的,StreamRequestHandler 來處理 stream socket,BaseHTTPRequestHandler 則是用來處理 HTTP 層面的內容,這部分和 WSGI 接口關系不大,更多的是 Web 服務器的具體實現,可以忽略。

微服務器實例

如果上面的 wsgiref 過于復雜的話,下面一起來實現一個微小的 Web 服務器,便于我們理解 Web 服務器端 WSGI 接口的實現。代碼摘自 自己動手開發網絡服務器(二),放在 gist 上,主要結構如下:

  1. class WSGIServer(object): 
  2.     # 套接字參數 
  3.     address_family, socket_type = socket.AF_INET, socket.SOCK_STREAM 
  4.     request_queue_size = 1 
  5.     def __init__(self, server_address): 
  6.         # TCP 服務端初始化:創建套接字,綁定地址,監聽端口 
  7.         # 獲取服務器地址,端口 
  8.     def set_app(self, application): 
  9.         # 獲取框架提供的 application 
  10.         self.application = application 
  11.     def serve_forever(self): 
  12.         # 處理 TCP 連接:獲取請求內容,調用處理函數 
  13.     def handle_request(self): 
  14.         # 解析 HTTP 請求,獲取 environ,處理請求內容,返回HTTP響應結果 
  15.         env = self.get_environ() 
  16.         result = self.application(env, self.start_response) 
  17.         self.finish_response(result) 
  18.     def parse_request(self, text): 
  19.         # 解析 HTTP 請求 
  20.          
  21.     def get_environ(self): 
  22.         # 分析 environ 參數,這里只是示例,實際情況有很多參數。 
  23.         env['wsgi.url_scheme']   = 'http' 
  24.         ... 
  25.         env['REQUEST_METHOD']    =  self.request_method    # GET 
  26.         ... 
  27.         return env 
  28.     def start_response(self, status, response_headers, exc_info=None): 
  29.         # 添加響應頭,狀態碼 
  30.         self.headers_set = [status, response_headers + server_headers] 
  31.     def finish_response(self, result): 
  32.         # 返回 HTTP 響應信息 
  33. SERVER_ADDRESS = (HOST, PORT) = '', 8888 
  34. # 創建一個服務器實例 
  35. def make_server(server_address, application): 
  36.     server = WSGIServer(server_address) 
  37.     server.set_app(application) 
  38.     return server  

目前支持 WSGI 的成熟Web服務器有很多,Gunicorn是相當不錯的一個。它脫胎于ruby社區的Unicorn,成功移植到python上,成為一個WSGI HTTP Server。有以下優點:

  • 容易配置
  • 可以自動管理多個worker進程
  • 選擇不同的后臺擴展接口(sync, gevent, tornado等)

應用程序端(框架)

和服務器端相比,應用程序端(也可以認為框架)要做的事情就簡單很多,它只需要提供一個可調用對象(一般習慣將其命名為application),這個對象接收服務器端傳遞的兩個參數 environ 和 start_response。這里的可調用對象不僅可以是函數,還可以是類(下面第二個示例)或者擁有 __call__ 方法的實例,總之只要可以接受前面說的兩個參數,并且返回值可以被服務器進行迭代即可。

Application 具體要做的就是根據 environ 里面提供的關于 HTTP 請求的信息,進行一定的業務處理,返回一個可迭代對象,服務器端通過迭代這個對象,來獲得 HTTP 響應的正文。如果沒有響應正文,那么可以返回None。

同時,application 還會調用服務器提供的 start_response,產生HTTP響應的狀態碼和響應頭,原型如下:

  1. def start_response(self, status, headers,exc_info=None):  

Application 需要提供 status:一個字符串,表示HTTP響應狀態字符串,還有 response_headers: 一個列表,包含有如下形式的元組:(header_name, header_value),用來表示HTTP響應的headers。同時 exc_info 是可選的,用于出錯時,server需要返回給瀏覽器的信息。

到這里為止,我們就可以實現一個簡單的 application 了,如下所示:

  1. def simple_app(environ, start_response): 
  2.     """Simplest possible application function""" 
  3.     HELLO_WORLD = "Hello world!\n" 
  4.     status = '200 OK' 
  5.     response_headers = [('Content-type''text/plain')] 
  6.     start_response(status, response_headers) 
  7.     return [HELLO_WORLD]  

或者用類實現如下。

  1. class AppClass: 
  2.     """Produce the same output, but using a class""" 
  3.     def __init__(self, environ, start_response): 
  4.         self.environ = environ 
  5.         self.start = start_response 
  6.     def __iter__(self): 
  7.         ... 
  8.         HELLO_WORLD = "Hello world!\n" 
  9.         yield HELLO_WORLD  

注意這里 AppClass 類本身就是 application,用 environ 和 start_response 調用(實例化)它返回一個實例對象,這個實例對象本身是可迭代的,符合 WSGI 對 application 的要求。

如果想使用 AppClass 類的對象作為 application,那么必須給類添加一個 __call__ 方法,接受 environ 和 start_response 為參數,返回可迭代對象,如下所示:

  1. class AppClass: 
  2.     """Produce the same output, but using an object""" 
  3.     def __call__(self, environ, start_response):  

這部分涉及到python的一些高級特性,比如 yield 和 magic method,可以參考我總結的python語言要點來理解。

Flask 中的 WSGI

flask 是一個輕量級的Python Web框架,符合 WSGI 的規范要求。它的最初版本只有 600 多行,相對便于理解。下面我們來看下它最初版本中關于 WSGI 接口的部分。

  1. def wsgi_app(self, environ, start_response): 
  2.     """The actual WSGI application. 
  3.     This is not implemented in `__call__` so that middlewares can be applied: 
  4.         app.wsgi_app = MyMiddleware(app.wsgi_app) 
  5.     ""
  6.     with self.request_context(environ): 
  7.         rv = self.preprocess_request() 
  8.         if rv is None: 
  9.             rv = self.dispatch_request() 
  10.         response = self.make_response(rv) 
  11.         response = self.process_response(response) 
  12.         return response(environ, start_response) 
  13. def __call__(self, environ, start_response): 
  14.     """Shortcut for :attr:`wsgi_app`""" 
  15.     return self.wsgi_app(environ, start_response)  

這里的 wsgi_app 實現了我們說的 application 功能,rv 是 對請求的封裝,response 是框架用來處理業務邏輯的具體函數。這里對 flask 源碼不做過多解釋,感興趣的可以去github下載,然后check 到最初版本去查看。

中間件

前面 flask 代碼 wsgi_app 函數的注釋中提到不直接在 __call__ 中實現 application 部分,是為了可以使用中間件。 那么為什么要使用中間件,中間件又是什么呢?

回顧前面的 application/server 端接口,對于一個 HTTP 請求,server 端總是會調用一個 application 來進行處理,并返回 application 處理后的結果。這足夠應付一般的場景了,不過并不完善,考慮下面的幾種應用場景:

  • 對于不同的請求(比如不同的 URL),server 需要調用不同的 application,那么如何選擇調用哪個呢;
  • 為了做負載均衡或者是遠程處理,需要使用網絡上其他主機上運行的 application 來做處理;
  • 需要對 application 返回的內容做一定處理后才能作為 HTTP 響應;

上面這些場景有一個共同點就是,有一些必需的操作不管放在服務端還是應用(框架)端都不合適。對應用端來說,這些操作應該由服務器端來做,對服務器端來說,這些操作應該由應用端來做。為了處理這種情況,引入了中間件。

中間件就像是應用端和服務端的橋梁,來溝通兩邊。對服務器端來說,中間件表現的像是應用端,對應用端來說,它表現的像是服務器端。如下圖所示:

 中間件

中間件的實現

flask 框架在 Flask 類的初始化代碼中就使用了中間件:

  1. self.wsgi_app = SharedDataMiddleware(self.wsgi_app, { self.static_path: target })  

這里的作用和 python 中的裝飾器一樣,就是在執行 self.wsgi_app 前后執行 SharedDataMiddleware 中的一些內容。中間件做的事,很類似python中裝飾器做的事情。SharedDataMiddleware 中間件是 werkzeug 庫提供的,用來支持站點托管靜態內容。此外,還有DispatcherMiddleware 中間件,用來支持根據不同的請求,調用不同的 application,這樣就可以解決前面場景 1, 2 中的問題了。

下面來看看 DispatcherMiddleware 的實現:

  1. class DispatcherMiddleware(object): 
  2.     """Allows one to mount middlewares or applications in a WSGI application. 
  3.     This is useful if you want to combine multiple WSGI applications:: 
  4.         app = DispatcherMiddleware(app, { 
  5.             '/app2':        app2, 
  6.             '/app3':        app3 
  7.         }) 
  8.     ""
  9.     def __init__(self, app, mounts=None): 
  10.         self.app = app 
  11.         self.mounts = mounts or {} 
  12.     def __call__(self, environ, start_response): 
  13.         script = environ.get('PATH_INFO'''
  14.         path_info = '' 
  15.         while '/' in script: 
  16.             if script in self.mounts: 
  17.                 app = self.mounts[script] 
  18.                 break 
  19.             script, last_item = script.rsplit('/', 1) 
  20.             path_info = '/%s%s' % (last_item, path_info) 
  21.         else
  22.             app = self.mounts.get(script, self.app) 
  23.         original_script_name = environ.get('SCRIPT_NAME'''
  24.         environ['SCRIPT_NAME'] = original_script_name + script 
  25.         environ['PATH_INFO'] = path_info 
  26.         return app(environ, start_response)  

初始化中間件時需要提供一個 mounts 字典,用來指定不同 URL 路徑到 application 的映射關系。這樣對于一個請求,中間件檢查其路徑,然后選擇合適的 application 進行處理。

關于 WSGI 的原理部分基本結束,下一篇我會介紹下對 flask 框架的理解。

責任編輯:龐桂玉 來源: selfboot博客
相關推薦

2016-11-02 13:33:43

2016-10-19 08:36:51

2016-11-02 14:18:45

搭建論壇Flask框架

2016-08-22 20:37:10

PythonWeb服務器

2024-05-15 14:29:45

2023-11-17 09:13:36

2017-09-13 14:01:51

數據庫MongoDB數據庫即服務

2015-10-15 14:16:24

2023-11-23 15:06:36

PythonHTTP服務器

2010-02-22 09:39:52

HTML 5Web

2015-11-17 16:11:07

Code Review

2018-04-18 07:01:59

Docker容器虛擬機

2019-01-18 12:39:45

云計算PaaS公有云

2025-04-23 03:00:00

多模態RAGMinerU

2013-07-11 10:03:36

JavaScript框架

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構

2016-08-10 16:28:00

WebURLHTTP

2016-10-11 12:45:50

PythonWeb服務器
點贊
收藏

51CTO技術棧公眾號

精品国产乱码久久久久久浪潮| 中文字幕一区二区5566日韩| 欧美亚洲伦理www| 魔女鞋交玉足榨精调教| 韩漫成人漫画| 国产精品久久久久影院亚瑟| www.久久草| 日韩av大片在线观看| 超碰成人久久| 日韩欧美亚洲另类制服综合在线| 天堂…中文在线最新版在线| 国产精品99999| 国内精品久久久久影院薰衣草 | 99视频在线观看地址| 国产精品 日产精品 欧美精品| 欧美在线xxx| 国产精品视频一区二区三| 美女视频免费精品| 欧美精品第1页| www黄色日本| 宅男网站在线免费观看| 久久综合精品国产一区二区三区| 成人免费视频a| 人人草在线观看| 亚洲午夜电影| 久久精品小视频| 精品无码在线观看| 久久黄色影视| 日韩三级在线观看| 成年网站在线播放| 国产免费不卡| 婷婷丁香激情综合| www成人免费| 成人av福利| 国产精品久久久久久久第一福利| 久久久久久一区| 精品国精品国产自在久不卡| 青青草91视频| 日本亚洲欧美三级| 中文字幕亚洲精品在线| 欧美日韩伊人| 美日韩在线视频| 亚洲少妇xxx| 国产不卡av一区二区| 日韩国产欧美区| 欧美夫妇交换xxx| 午夜视频一区二区在线观看| 91精品国产入口在线| 中文字幕第38页| av成人免费| 欧洲亚洲国产日韩| av视屏在线播放| 卡通欧美亚洲| 在线看日本不卡| 狠狠热免费视频| 在线成人视屏| 欧美午夜影院一区| www亚洲成人| 欧美成人黄色| 777奇米四色成人影色区| 性猛交ⅹ×××乱大交| 国产福利亚洲| 91精品国产综合久久精品性色| 波多野结衣国产精品| 永久免费观看精品视频| 91精品国产福利| 69久久精品无码一区二区| 日韩精品三级| 精品国产一区二区精华| 日本69式三人交| 午夜欧洲一区| 欲色天天网综合久久| eeuss中文字幕| 久久精品青草| 久久久亚洲网站| 久久国产视频精品| 日本欧美在线看| 91久久精品在线| 丰满熟妇人妻中文字幕| 91色porny蝌蚪| 日韩免费电影一区二区| 免费看美女视频在线网站 | 国产一级特黄毛片| 亚洲欧美bt| 国产精品久久久av| 国产三级视频在线播放| 成人深夜福利app| 欧美久久综合性欧美| 视频免费一区| 亚洲一区二区av电影| 久久国产成人精品国产成人亚洲 | 色婷婷久久久亚洲一区二区三区| 爱情岛论坛vip永久入口| 亚瑟国产精品| 日韩电影第一页| 中文字幕黄色网址| 黄色工厂这里只有精品| 日本久久久久久| 精品久久久无码中文字幕| 91在线国产观看| www.午夜色| 神马久久午夜| 欧美一区二区三区人| 成人手机在线免费视频| 五月天久久777| 欧美一区二区三区免费观看| 国产亲伦免费视频播放| 91免费看片在线观看| 亚洲精品一品区二品区三品区| 羞羞的网站在线观看| 91福利视频在线| wwwxx日本| 91视频综合| 日本成人精品在线| 亚洲国产精品久久久久久久| 日本一区二区久久| 欧美一级片免费播放| 亚洲成人毛片| 亚洲男人7777| 久久精品国产亚洲AV无码麻豆| 欧美aa在线视频| 狠狠色综合网站久久久久久久| 麻豆系列在线观看| 日本韩国精品在线| 亚洲一区二区三区四区av| 99精品综合| 国产成人久久久精品一区| 99国产揄拍国产精品| 国产欧美精品一区二区三区四区| 青娱乐自拍偷拍| 精品一区二区三区在线观看视频| 亚洲免费影视第一页| 香蕉免费毛片视频| 懂色av中文字幕一区二区三区| 在线看无码的免费网站| 户外露出一区二区三区| 亚洲精品国产美女| 日韩精品成人在线| 岛国一区二区在线观看| 久操手机在线视频| 久久一级大片| 欧美成年人视频网站| 国产精品久久久久久久免费| 欧美经典一区二区三区| 日韩精品无码一区二区三区免费| 精品五月天堂| 午夜精品久久久久久99热| 亚洲成人中文字幕在线| 一区二区三区鲁丝不卡| 又大又长粗又爽又黄少妇视频| 亚洲中无吗在线| 亚洲精品免费网站| av文字幕在线观看| 欧美一区午夜视频在线观看| 免费国产羞羞网站美图| 国产一区二区视频在线播放| 在线观看成人免费| 久久伊人影院| 久久全国免费视频| 午夜在线视频观看| 色8久久人人97超碰香蕉987| 国产成人精品无码免费看夜聊软件| 国产欧美在线| 欧美一区观看| 精品国产美女a久久9999| 色噜噜久久综合伊人一本| 亚洲无码久久久久| 一区二区三区在线观看国产| 成人三级做爰av| 亚洲大胆视频| 免费久久一级欧美特大黄| 日韩欧美另类一区二区| 综合网日日天干夜夜久久| 91激情在线观看| 亚洲国产精品人人做人人爽| 中文字幕国产专区| 精品一区二区在线视频| 日本a在线天堂| 亚洲深夜福利在线观看| 国产日韩欧美视频在线| 午夜伦理在线视频| 日韩精品在线私人| 在线观看亚洲国产| 伊人一区二区三区| 亚洲乱码国产乱码精品精大量| 日本欧美一区二区| 久久久久久久久网| 久久97视频| 亚洲xxxx3d| 小视频免费在线观看| 中文字幕欧美国内| 亚洲欧美另类综合| 日本韩国欧美在线| 国产性70yerg老太| 国产色产综合产在线视频| 亚洲精品在线视频播放| 一区二区毛片| 一区二区三区日韩视频| 欧美一区二区三区久久| 91亚洲一区精品| 亚洲精品国产精品国产| 欧美成人一区二区三区电影| 欧洲天堂在线观看| 日韩欧美一级片| 最近中文字幕av| 香蕉成人伊视频在线观看| 免费91在线观看| 91在线看国产| 精人妻一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩中文不卡| 久久丝袜视频| 亚洲自拍偷拍视频| 日韩高清成人| 91高清视频免费观看| av官网在线播放| 国产亚洲激情在线| 色窝窝无码一区二区三区| 欧美久久婷婷综合色| 波多野结衣视频免费观看| 香蕉久久一区二区不卡无毒影院| 97成人资源站| 国产精品免费视频一区| 丰满少妇高潮一区二区| 丁香五精品蜜臀久久久久99网站| 亚洲欧美久久久久| 老司机午夜免费精品视频| 国产免费黄色一级片| 午夜国产欧美理论在线播放 | 欧美日韩精品一区二区三区蜜桃 | 亚洲国产欧美一区二区丝袜黑人| 国产女18毛片多18精品| 欧美视频日韩视频| 青青视频在线免费观看| 大伊人狠狠躁夜夜躁av一区| 国产成人精品av久久| 一区二区在线看| 一区二区国产精品精华液| 国产精品成人午夜| 免费看一级黄色| 国产精品久久久久久久岛一牛影视| 法国空姐电影在线观看| 久久色成人在线| 无码人妻精品一区二区三应用大全| 成人国产在线观看| 国产大学生av| 国产suv精品一区二区883| 韩国三级在线播放| 国产高清成人在线| 少妇丰满尤物大尺度写真| 国产成人免费视频网站高清观看视频 | 99thz桃花论族在线播放| 欧美精品videos| 波多野在线观看| 性色av一区二区三区红粉影视| 第四色日韩影片| 91精品国产乱码久久久久久蜜臀| 嗯~啊~轻一点视频日本在线观看| 97色在线观看| 香蕉成人av| 国产精品亚洲欧美导航| 99tv成人影院| 99国内精品久久久久久久软件| 国产精品xxx在线观看| 久久久com| 狠狠色丁香婷婷综合影院| 亚洲在线视频一区二区| 一区二区三区四区日韩| 9色porny| 久久www成人_看片免费不卡| 欧美日韩亚洲一二三| 美国av一区二区| 可以看的av网址| 91免费在线看| 日本二区三区视频| 亚洲无线码一区二区三区| 国产高潮久久久| 欧美日韩一区二区三区在线看| 国产免费av电影| 精品国产一二三区| 国产午夜精品一区理论片| 日韩中文av在线| 污污的网站在线看| 欧洲亚洲女同hd| 国产aⅴ精品一区二区四区| 国产日韩欧美一区二区三区四区| 久久爱www成人| 久久人妻无码一区二区| 亚洲专区免费| 国产三级精品三级在线| 97久久超碰精品国产| 美女av免费看| 亚洲444eee在线观看| 黄色av一区二区| 日韩欧美色综合网站| 久草视频在线看| 久久精品国产99国产精品澳门| 激情网站在线| 国产精品情侣自拍| 亚洲综合影院| 先锋影音日韩| 亚洲精品社区| 久久无码人妻一区二区三区| 久久综合九色综合久久久精品综合| 成年人免费视频播放| 婷婷中文字幕综合| 一级黄色片免费看| 亚洲国产精品系列| 黄色一级片在线观看| 欧美在线亚洲一区| 国产精品黄网站| 樱花www成人免费视频| 性欧美xxxx大乳国产app| 性生活一级大片| 亚洲国产精品激情在线观看| 国产无遮无挡120秒| 在线成人av网站| 韩国三级在线观看久| 欧美激情欧美狂野欧美精品| 99久久er| 日本不卡在线播放| 亚洲美女色禁图| 制服.丝袜.亚洲.中文.综合懂| 欧美国产精品劲爆| www成人在线| 精品国产一区二区精华| а√天堂资源地址在线下载| 国产精品香蕉国产| 欧美日中文字幕| 国产日韩一区二区在线| 成+人+亚洲+综合天堂| 国产十六处破外女视频| 欧美日韩成人在线一区| 阿v免费在线观看| 日本午夜人人精品| 九九亚洲视频| 久久久久久久久久久久久国产精品 | 中文字幕亚洲精品乱码 | 日韩黄色碟片| 日本免费高清不卡| 久久精品一区二区三区中文字幕| 国产 xxxx| 亚洲一卡二卡三卡四卡无卡久久| 超碰在线播放97| 欧美精品在线观看| 日韩在线视频一区二区三区| 欧美h视频在线观看| 看片的网站亚洲| 日本精品在线免费观看| 在线电影院国产精品| а√天堂8资源在线官网| 亚洲最大福利网站| 午夜精品偷拍| 伊人影院在线观看视频| 亚洲一区二三区| 欧美视频在线观看一区二区三区| 欧美精品videosex牲欧美| 国产精品17p| 成人在线免费在线观看| 欧美天堂一区二区| 岛国精品在线观看| 色屁屁草草影院ccyy.com| 色丁香久综合在线久综合在线观看| 麻豆app在线观看| 国产精品久久久久久久久久小说| 欧美一区二区三| 亚洲xxx在线观看| 亚洲免费视频中文字幕| 风流老熟女一区二区三区| 久久久久久国产精品久久| 欧美1区2区3区4区| www.xxx亚洲| 国产精品成人一区二区艾草| 国产三级视频在线播放| 国内精品中文字幕| 国产aⅴ精品一区二区三区久久| 中文字幕免费高清在线| 亚洲一区二区三区自拍| 日本精品专区| 成人激情电影一区二区| 亚洲特级毛片| 午夜精产品一区二区在线观看的| 欧美人xxxx| 91九色国产在线播放| 日韩亚洲视频在线| 国产精品亚洲一区二区三区妖精| 国产真实乱人偷精品视频| 亚洲午夜久久久久久久| www.久久久.com| 凹凸国产熟女精品视频| 国产精品久久午夜夜伦鲁鲁| 好吊视频一区二区三区| 国产精品久久久久久久久久东京| 亚洲国产一区二区在线观看 | 精品视频一区二区三区| 青青草原av在线播放| 日韩久久一区二区| 日韩在线无毛| 亚洲精品欧美日韩专区| 久久精品麻豆|