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

用Python寫(xiě)一個(gè)簡(jiǎn)單的Web框架

開(kāi)發(fā) 后端
本文嘗試寫(xiě)一個(gè)類似web.py的Web框架。好吧,我承認(rèn)我夸大其辭了:首先,web.py并不簡(jiǎn)單;其次,本文只重點(diǎn)實(shí)現(xiàn)了 URL調(diào)度(URL dispatch)部分。

用Python寫(xiě)一個(gè)簡(jiǎn)單的Web框架

  •  一、概述
  • 二、從demo_app開(kāi)始
  • 三、WSGI中的application
  • 四、區(qū)分URL
  • 五、重構(gòu)
    • 1、正則匹配URL
    • 2、DRY
    • 3、抽象出框架
  • 六、參考

一、概述

在Python中,WSGI(Web Server Gateway Interface)定義了Web服務(wù)器與Web應(yīng)用(或Web框架)之間的標(biāo)準(zhǔn)接口。在WSGI的規(guī)范下,各種各樣的Web服務(wù)器和Web框架都可以很好的交互。

由于WSGI的存在,用Python寫(xiě)一個(gè)簡(jiǎn)單的Web框架也變得非常容易。然而,同很多其他的強(qiáng)大軟件一樣,要實(shí)現(xiàn)一個(gè)功能豐富、健壯高效的Web框架并非易事;如果您打算這么做,可能使用一個(gè)現(xiàn)成的Web框架(如 Django、Tornado、web.py 等)會(huì)是更合適的選擇。

本文嘗試寫(xiě)一個(gè)類似web.py的Web框架。好吧,我承認(rèn)我夸大其辭了:首先,web.py并不簡(jiǎn)單;其次,本文只重點(diǎn)實(shí)現(xiàn)了 URL調(diào)度(URL dispatch)部分。

二、從demo_app開(kāi)始

首先,作為一個(gè)初步體驗(yàn),我們可以借助 wsgiref.simple_server 來(lái)搭建一個(gè)簡(jiǎn)單無(wú)比(trivial)的Web應(yīng)用:

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. from wsgiref.simple_server import make_server, demo_app 
  8.  
  9.   
  10.  
  11. httpd = make_server('', 8086, demo_app) 
  12.  
  13. sa = httpd.socket.getsockname() 
  14.  
  15. print 'http://{0}:{1}/'.format(*sa) 
  16.  
  17.   
  18.  
  19. # Respond to requests until process is killed 
  20.  
  21. httpd.serve_forever()  

運(yùn)行腳本:

  1. $ python code.py 
  2.  
  3. http://0.0.0.0:8086/  

打開(kāi)瀏覽器,輸入http://0.0.0.0:8086/后可以看到:一行”Hello world!” 和 眾多環(huán)境變量值。

三、WSGI中的application

WSGI中規(guī)定:application是一個(gè) 可調(diào)用對(duì)象(callable object),它接受 environ 和 start_response 兩個(gè)參數(shù),并返回一個(gè) 字符串迭代對(duì)象。

其中,可調(diào)用對(duì)象 包括 函數(shù)、方法、類 或者 具有__call__方法的 實(shí)例;environ 是一個(gè)字典對(duì)象,包括CGI風(fēng)格的環(huán)境變量(CGI-style environment variables)和 WSGI必需的變量(WSGI-required variables);start_response 是一個(gè)可調(diào)用對(duì)象,它接受兩個(gè) 常規(guī)參數(shù)(status,response_headers)和 一個(gè) 默認(rèn)參數(shù)(exc_info);字符串迭代對(duì)象 可以是 字符串列表、生成器函數(shù) 或者 具有__iter__方法的可迭代實(shí)例。更多細(xì)節(jié)參考 Specification Details。

The Application/Framework Side 中給出了一個(gè)典型的application實(shí)現(xiàn):

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """application.py""" 
  8.  
  9.   
  10.  
  11. def simple_app(environ, start_response): 
  12.  
  13.     """Simplest possible application object""" 
  14.  
  15.     status = '200 OK' 
  16.  
  17.     response_headers = [('Content-type''text/plain')] 
  18.  
  19.     start_response(status, response_headers) 
  20.  
  21.     return ['Hello world!\n' 

現(xiàn)在用simple_app來(lái)替換demo_app:

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """code.py""" 
  8.  
  9.   
  10.  
  11. from wsgiref.simple_server import make_server 
  12.  
  13. from application import simple_app as app 
  14.  
  15.   
  16.  
  17. if __name__ == '__main__'
  18.  
  19.     httpd = make_server('', 8086, app) 
  20.  
  21.     sa = httpd.socket.getsockname() 
  22.  
  23.     print 'http://{0}:{1}/'.format(*sa) 
  24.  
  25.   
  26.  
  27.     # Respond to requests until process is killed 
  28.  
  29.     httpd.serve_forever()  

運(yùn)行腳本code.py后,訪問(wèn)http://0.0.0.0:8086/就可以看到那行熟悉的句子:Hello world!

四、區(qū)分URL

倒騰了一陣子后,您會(huì)發(fā)現(xiàn)不管如何改變URL中的path部分,得到的響應(yīng)都是一樣的。因?yàn)閟imple_app只識(shí)別host+port部分。

為了對(duì)URL中的path部分進(jìn)行區(qū)分處理,需要修改application.py的實(shí)現(xiàn)。

首先,改用 類 來(lái)實(shí)現(xiàn)application:

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """application.py""" 
  8.  
  9.   
  10.  
  11. class my_app: 
  12.  
  13.     def __init__(self, environ, start_response): 
  14.  
  15.         self.environ = environ 
  16.  
  17.         self.start = start_response 
  18.  
  19.   
  20.  
  21.     def __iter__(self): 
  22.  
  23.         status = '200 OK' 
  24.  
  25.         response_headers = [('Content-type''text/plain')] 
  26.  
  27.         self.start(status, response_headers) 
  28.  
  29.         yield "Hello world!\n"  

然后,增加對(duì)URL中path部分的區(qū)分處理:

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """application.py""" 
  8.  
  9.   
  10.  
  11. class my_app: 
  12.  
  13.     def __init__(self, environ, start_response): 
  14.  
  15.         self.environ = environ 
  16.  
  17.         self.start = start_response 
  18.  
  19.   
  20.  
  21.     def __iter__(self): 
  22.  
  23.         path = self.environ['PATH_INFO'
  24.  
  25.         if path == "/"
  26.  
  27.             return self.GET_index() 
  28.  
  29.         elif path == "/hello"
  30.  
  31.             return self.GET_hello() 
  32.  
  33.         else
  34.  
  35.             return self.notfound() 
  36.  
  37.   
  38.  
  39.     def GET_index(self): 
  40.  
  41.         status = '200 OK' 
  42.  
  43.         response_headers = [('Content-type''text/plain')] 
  44.  
  45.         self.start(status, response_headers) 
  46.  
  47.         yield "Welcome!\n" 
  48.  
  49.   
  50.  
  51.     def GET_hello(self): 
  52.  
  53.         status = '200 OK' 
  54.  
  55.         response_headers = [('Content-type''text/plain')] 
  56.  
  57.         self.start(status, response_headers) 
  58.  
  59.         yield "Hello world!\n" 
  60.  
  61.   
  62.  
  63.     def notfound(self): 
  64.  
  65.         status = '404 Not Found' 
  66.  
  67.         response_headers = [('Content-type''text/plain')] 
  68.  
  69.         self.start(status, response_headers) 
  70.  
  71.         yield "Not Found\n"  

修改code.py中的from application import simple_app as app,用my_app來(lái)替換simple_app后即可體驗(yàn)效果。

五、重構(gòu)

上面的代碼雖然奏效,但是在編碼風(fēng)格和靈活性方面有很多問(wèn)題,下面逐步對(duì)其進(jìn)行重構(gòu)。

1、正則匹配URL

消除URL硬編碼,增加URL調(diào)度的靈活性:

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """application.py""" 
  8.  
  9.   
  10.  
  11. import re ##########修改點(diǎn) 
  12.  
  13.   
  14.  
  15. class my_app: 
  16.  
  17.   
  18.  
  19.     urls = ( 
  20.  
  21.         ("/""index"), 
  22.  
  23.         ("/hello/(.*)""hello"), 
  24.  
  25.     ) ##########修改點(diǎn) 
  26.  
  27.   
  28.  
  29.     def __init__(self, environ, start_response): 
  30.  
  31.         self.environ = environ 
  32.  
  33.         self.start = start_response 
  34.  
  35.   
  36.  
  37.     def __iter__(self): ##########修改點(diǎn) 
  38.  
  39.         path = self.environ['PATH_INFO'
  40.  
  41.         method = self.environ['REQUEST_METHOD'
  42.  
  43.   
  44.  
  45.         for pattern, name in self.urls: 
  46.  
  47.             m = re.match('^' + pattern + '$', path) 
  48.  
  49.             if m: 
  50.  
  51.                 # pass the matched groups as arguments to the function 
  52.  
  53.                 args = m.groups() 
  54.  
  55.                 funcname = method.upper() + '_' + name 
  56.  
  57.                 if hasattr(self, funcname): 
  58.  
  59.                     func = getattr(self, funcname) 
  60.  
  61.                     return func(*args) 
  62.  
  63.   
  64.  
  65.         return self.notfound() 
  66.  
  67.   
  68.  
  69.     def GET_index(self): 
  70.  
  71.         status = '200 OK' 
  72.  
  73.         response_headers = [('Content-type''text/plain')] 
  74.  
  75.         self.start(status, response_headers) 
  76.  
  77.         yield "Welcome!\n" 
  78.  
  79.   
  80.  
  81.     def GET_hello(self, name): ##########修改點(diǎn) 
  82.  
  83.         status = '200 OK' 
  84.  
  85.         response_headers = [('Content-type''text/plain')] 
  86.  
  87.         self.start(status, response_headers) 
  88.  
  89.         yield "Hello %s!\n" % name 
  90.  
  91.   
  92.  
  93.     def notfound(self): 
  94.  
  95.         status = '404 Not Found' 
  96.  
  97.         response_headers = [('Content-type''text/plain')] 
  98.  
  99.         self.start(status, response_headers) 
  100.  
  101.         yield "Not Found\n"  

2、DRY

消除GET_*方法中的重復(fù)代碼,并且允許它們返回字符串:

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """application.py""" 
  8.  
  9.   
  10.  
  11. import re 
  12.  
  13.   
  14.  
  15. class my_app: 
  16.  
  17.   
  18.  
  19.     urls = ( 
  20.  
  21.         ("/""index"), 
  22.  
  23.         ("/hello/(.*)""hello"), 
  24.  
  25.     ) 
  26.  
  27.   
  28.  
  29.     def __init__(self, environ, start_response): ##########修改點(diǎn) 
  30.  
  31.         self.environ = environ 
  32.  
  33.         self.start = start_response 
  34.  
  35.         self.status = '200 OK' 
  36.  
  37.         self._headers = [] 
  38.  
  39.   
  40.  
  41.     def __iter__(self): ##########修改點(diǎn) 
  42.  
  43.         result = self.delegate() 
  44.  
  45.         self.start(self.status, self._headers) 
  46.  
  47.   
  48.  
  49.         # 將返回值result(字符串 或者 字符串列表)轉(zhuǎn)換為迭代對(duì)象 
  50.  
  51.         if isinstance(result, basestring): 
  52.  
  53.             return iter([result]) 
  54.  
  55.         else
  56.  
  57.             return iter(result) 
  58.  
  59.   
  60.  
  61.     def delegate(self): ##########修改點(diǎn) 
  62.  
  63.         path = self.environ['PATH_INFO'
  64.  
  65.         method = self.environ['REQUEST_METHOD'
  66.  
  67.   
  68.  
  69.         for pattern, name in self.urls: 
  70.  
  71.             m = re.match('^' + pattern + '$', path) 
  72.  
  73.             if m: 
  74.  
  75.                 # pass the matched groups as arguments to the function 
  76.  
  77.                 args = m.groups() 
  78.  
  79.                 funcname = method.upper() + '_' + name 
  80.  
  81.                 if hasattr(self, funcname): 
  82.  
  83.                     func = getattr(self, funcname) 
  84.  
  85.                     return func(*args) 
  86.  
  87.   
  88.  
  89.         return self.notfound() 
  90.  
  91.   
  92.  
  93.     def header(self, name, value): ##########修改點(diǎn) 
  94.  
  95.         self._headers.append((name, value)) 
  96.  
  97.   
  98.  
  99.     def GET_index(self): ##########修改點(diǎn) 
  100.  
  101.         self.header('Content-type''text/plain'
  102.  
  103.         return "Welcome!\n" 
  104.  
  105.   
  106.  
  107.     def GET_hello(self, name): ##########修改點(diǎn) 
  108.  
  109.         self.header('Content-type''text/plain'
  110.  
  111.         return "Hello %s!\n" % name 
  112.  
  113.   
  114.  
  115.     def notfound(self): ##########修改點(diǎn) 
  116.  
  117.         self.status = '404 Not Found' 
  118.  
  119.         self.header('Content-type''text/plain'
  120.  
  121.         return "Not Found\n"  

3、抽象出框架

為了將類my_app抽象成一個(gè)獨(dú)立的框架,需要作出以下修改:

  • 剝離出其中的具體處理細(xì)節(jié):urls配置 和 GET_*方法(改成在多個(gè)類中實(shí)現(xiàn)相應(yīng)的GET方法)
  • 把方法header實(shí)現(xiàn)為類方法(classmethod),以方便外部作為功能函數(shù)調(diào)用
  • 改用 具有__call__方法的 實(shí)例 來(lái)實(shí)現(xiàn)application

修改后的application.py(最終版本):

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """application.py""" 
  8.  
  9.   
  10.  
  11. import re 
  12.  
  13.   
  14.  
  15. class my_app: 
  16.  
  17.     """my simple web framework""" 
  18.  
  19.   
  20.  
  21.     headers = [] 
  22.  
  23.   
  24.  
  25.     def __init__(self, urls=(), fvars={}): 
  26.  
  27.         self._urls = urls 
  28.  
  29.         self._fvars = fvars 
  30.  
  31.   
  32.  
  33.     def __call__(self, environ, start_response): 
  34.  
  35.         self._status = '200 OK' # 默認(rèn)狀態(tài)OK 
  36.  
  37.         del self.headers[:] # 清空上一次的headers 
  38.  
  39.   
  40.  
  41.         result = self._delegate(environ) 
  42.  
  43.         start_response(self._status, self.headers) 
  44.  
  45.   
  46.  
  47.         # 將返回值result(字符串 或者 字符串列表)轉(zhuǎn)換為迭代對(duì)象 
  48.  
  49.         if isinstance(result, basestring): 
  50.  
  51.             return iter([result]) 
  52.  
  53.         else
  54.  
  55.             return iter(result) 
  56.  
  57.   
  58.  
  59.     def _delegate(self, environ): 
  60.  
  61.         path = environ['PATH_INFO'
  62.  
  63.         method = environ['REQUEST_METHOD'
  64.  
  65.   
  66.  
  67.         for pattern, name in self._urls: 
  68.  
  69.             m = re.match('^' + pattern + '$', path) 
  70.  
  71.             if m: 
  72.  
  73.                 # pass the matched groups as arguments to the function 
  74.  
  75.                 args = m.groups() 
  76.  
  77.                 funcname = method.upper() # 方法名大寫(xiě)(如GET、POST) 
  78.  
  79.                 klass = self._fvars.get(name) # 根據(jù)字符串名稱查找類對(duì)象 
  80.  
  81.                 if hasattr(klass, funcname): 
  82.  
  83.                     func = getattr(klass, funcname) 
  84.  
  85.                     return func(klass(), *args) 
  86.  
  87.   
  88.  
  89.         return self._notfound() 
  90.  
  91.   
  92.  
  93.     def _notfound(self): 
  94.  
  95.         self._status = '404 Not Found' 
  96.  
  97.         self.header('Content-type''text/plain'
  98.  
  99.         return "Not Found\n" 
  100.  
  101.   
  102.  
  103.     @classmethod 
  104.  
  105.     def header(cls, name, value): 
  106.  
  107.         cls.headers.append((name, value))  

對(duì)應(yīng)修改后的code.py(最終版本):

  1. #!/usr/bin/env python 
  2.  
  3. # -*- coding: utf-8 -*- 
  4.  
  5.   
  6.  
  7. """code.py""" 
  8.  
  9.   
  10.  
  11. from application import my_app 
  12.  
  13.   
  14.  
  15. urls = ( 
  16.  
  17.     ("/""index"), 
  18.  
  19.     ("/hello/(.*)""hello"), 
  20.  
  21.  
  22.   
  23.  
  24. wsgiapp = my_app(urls, globals()) 
  25.  
  26.   
  27.  
  28. class index
  29.  
  30.     def GET(self): 
  31.  
  32.         my_app.header('Content-type''text/plain'
  33.  
  34.         return "Welcome!\n" 
  35.  
  36.   
  37.  
  38. class hello: 
  39.  
  40.     def GET(self, name): 
  41.  
  42.         my_app.header('Content-type''text/plain'
  43.  
  44.         return "Hello %s!\n" % name 
  45.  
  46.   
  47.  
  48. if __name__ == '__main__'
  49.  
  50.     from wsgiref.simple_server import make_server 
  51.  
  52.     httpd = make_server('', 8086, wsgiapp) 
  53.  
  54.   
  55.  
  56.     sa = httpd.socket.getsockname() 
  57.  
  58.     print 'http://{0}:{1}/'.format(*sa) 
  59.  
  60.   
  61.  
  62.     # Respond to requests until process is killed 
  63.  
  64.     httpd.serve_forever()  

當(dāng)然,您還可以在code.py中配置更多的URL映射,并實(shí)現(xiàn)相應(yīng)的類來(lái)對(duì)請(qǐng)求作出響應(yīng)。

六、參考

本文主要參考了 How to write a web framework in Python(作者 anandology 是web.py代碼的兩位維護(hù)者之一,另一位則是大名鼎鼎卻英年早逝的 Aaron Swartz),在此基礎(chǔ)上作了一些調(diào)整和修改,并摻雜了自己的一些想法。

如果您還覺(jué)得意猶未盡,Why so many Python web frameworks? 也是一篇很好的文章,也許它會(huì)讓您對(duì)Python中Web框架的敬畏之心蕩然無(wú)存:-)

責(zé)任編輯:龐桂玉 來(lái)源: Python開(kāi)發(fā)者
相關(guān)推薦

2015-10-12 16:45:26

NodeWeb應(yīng)用框架

2016-09-14 17:48:44

2016-12-20 13:55:52

2022-04-01 15:18:42

Web 框架網(wǎng)絡(luò)通信

2020-07-20 10:00:52

Python翻譯工具命令行

2010-04-19 17:21:36

Oracle寫(xiě)文件

2018-10-31 10:11:24

Python編程語(yǔ)言語(yǔ)音播放

2022-03-24 14:42:19

Python編程語(yǔ)言

2020-09-29 15:08:47

Go UI框架開(kāi)發(fā)

2019-09-23 09:11:02

Python文本編輯器操作系統(tǒng)

2023-04-07 15:45:13

Emojicode開(kāi)源編碼語(yǔ)言

2021-05-14 10:45:21

PythonNoSQL數(shù)據(jù)庫(kù)

2017-05-18 12:16:03

LinuxPythonNoSql

2021-08-04 11:55:45

Python天氣查詢PySide2

2023-05-10 08:05:41

GoWeb應(yīng)用

2023-04-10 14:20:47

ChatGPTRESTAPI

2009-05-08 09:32:27

JavaWeb編程框架

2020-06-04 12:55:44

PyTorch分類器神經(jīng)網(wǎng)絡(luò)

2019-05-14 12:30:07

PythonPygame游戲框架

2014-04-14 15:54:00

print()Web服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

最新黄网在线观看| 欧美a级片免费看| 国产丝袜精品丝袜| 成人激情综合网站| 另类美女黄大片| 中文字幕1区2区| 97在线视频免费观看完整版| av日韩在线网站| 热草久综合在线| 五月天免费网站| 深夜激情久久| 天天色综合天天| 欧美日韩无遮挡| 国产精品色综合| 亚洲国产电影| 亚洲区一区二区| 蜜臀视频一区二区三区| 成人综合影院| 成人看片网站| 国产精品久久久久久久久动漫 | 久久精品视频2| 97久久视频| 精品国精品国产| 免费在线观看的av网站| 三区四区电影在线观看| 成人自拍视频在线观看| 国产精品青草久久久久福利99| 在线观看亚洲大片短视频| 日韩三级久久| 在线欧美日韩精品| 国产欧美日韩小视频| 亚洲视频在线播放免费| 15—17女人毛片| 可以直接在线观看的av| 国产综合久久久久久鬼色| 性色av香蕉一区二区| 99精品欧美一区二区| 高清日韩中文字幕| 欧美巨大另类极品videosbest| 久久99中文字幕| 黄色av免费在线看| 成人精品视频一区| 91麻豆国产语对白在线观看| 免费黄色网址在线| 亚洲乱码视频| 欧美老女人在线视频| 久久久久久久久久久久久久久| 成人污污www网站免费丝瓜| 亚洲成人在线网站| 久久久成人精品一区二区三区| 青青青草原在线| 丁香天五香天堂综合| 91香蕉电影院| 国产精品国产三级国产aⅴ| 久久精品网址| 欧美一级在线亚洲天堂| 免费网站观看www在线观| 婷婷成人基地| 亚洲精品中文字幕有码专区| 国产精品九九视频| 成人激情自拍| 欧美一级久久久| 91欧美一区二区三区| 久久精品97| 久久精品一区八戒影视| 国产麻豆一区二区三区在线观看| 国内老熟妇对白hdxxxx| 国产在线一区二区| 亚洲精品欧美日韩专区| 91影院在线播放| 乱码第一页成人| 热99精品里视频精品| 亚洲黄色三级视频| 亚洲福利免费| 91精品国产91久久久| 毛片基地在线观看| 国产欧美短视频| 九九热这里只有精品6| 欧美成人777| 羞羞视频在线观看不卡| 一本精品一区二区三区| 中文字幕欧美日韩| 久久久免费看片| 久久中文字幕av| 久久久999精品| 青青草华人在线视频| 欧美aaaaaaaaaaaa| 久久精品国产久精国产一老狼| 久艹在线观看视频| 亚洲一区二区三区| 欧美不卡视频一区发布| 久一视频在线观看| 亚洲免费网站| 国产精品av在线| 一区二区三区精| 国产成人一区二区精品非洲| 国产视频不卡| 成人动漫在线免费观看| 亚洲视频网在线直播| 日本福利视频网站| 一区二区精品伦理...| 在线看一区二区| 捷克做爰xxxⅹ性视频| 成功精品影院| 亚洲天堂成人在线| 91插插插插插插| 9国产精品视频| 国产精品免费电影| 亚洲第一成人av| 成人激情黄色小说| 色一情一乱一伦一区二区三区丨| 国产在线看片| 狠狠干狠狠久久| 91高清国产视频| 成人台湾亚洲精品一区二区| 日韩欧美在线网站| 中文字幕被公侵犯的漂亮人妻| 99久久精品费精品国产风间由美| 久久久久久久成人| 中文在线字幕av| 北条麻妃一区二区三区| 色狠狠久久av五月综合| 黄网页免费在线观看| 午夜精品久久久久久不卡8050| 国产极品精品在线观看| 日本一二三四区视频| 91精品导航| 亚洲免费精彩视频| 久久国产在线视频| 蜜臀久久久久久久| 国产一区二区三区四区hd| 自拍视频在线网| 五月婷婷久久丁香| 亚洲免费黄色录像| 九色精品91| 久久全球大尺度高清视频| 在线观看免费中文字幕| 93久久精品日日躁夜夜躁欧美| 午夜精品一区二区三区四区| 蜜臀久久精品| 精品美女一区二区| 全网免费在线播放视频入口 | 日韩成人三级视频| 播放一区二区| 精品一区二区三区三区| 久久久久99精品成人片试看| 免费成人美女在线观看| 久久国产精品-国产精品| 欧美另类tv| 91麻豆精品国产91| 99热在线观看精品| 久久一区亚洲| 欧美不卡1区2区3区| 草草在线视频| 亚洲的天堂在线中文字幕| 成人免费精品动漫网站| 日本 国产 欧美色综合| 日产精品久久久一区二区| 91视频欧美| 日韩欧美美女一区二区三区| 极品魔鬼身材女神啪啪精品| 韩日av一区二区| 亚洲欧洲在线一区| 欧美v亚洲v综合v国产v仙踪林| 亚洲色图狂野欧美| 无码人妻丰满熟妇区五十路| 国产亚洲精品精华液| 蜜臀av无码一区二区三区| 丁香婷婷成人| 欧美成人激情视频免费观看| 99热这里只有精品5| 亚洲乱码精品一二三四区日韩在线| 精品视频免费看| av在线免费观看不卡| 天天久久综合| 91免费看国产| 欧美巨大xxxx做受沙滩| 欧美日韩国产高清一区二区三区| 永久免费毛片在线观看| 麻豆成人91精品二区三区| 亚洲欧美丝袜| 秋霞一区二区| 国内精品久久久久| 五月婷婷在线观看视频| 91精品办公室少妇高潮对白| 天堂在线中文视频| 国产在线一区观看| 分分操这里只有精品| 亚洲春色h网| 国产欧美精品久久久| 精品自拍一区| 亚洲国产精品yw在线观看| 欧美 日韩 精品| 欧美韩日一区二区三区四区| 国产美女18xxxx免费视频| 欧美喷水视频| 鲁丝片一区二区三区| 少妇高潮一区二区三区99| 欧美大片免费观看| 天天操天天干天天干| 欧美主播一区二区三区| 澳门黄色一级片| www国产精品av| 日本人69视频| 99av国产精品欲麻豆| 色婷婷精品国产一区二区三区| 精品视频在线播放一区二区三区| 91黑丝高跟在线| 欧美极品视频| 亚洲精品97久久| 中文av免费观看| 日韩美女精品在线| 2一3sex性hd| 精品亚洲aⅴ乱码一区二区三区| 日韩 欧美 视频| 欧美日韩一二三四| 波多野结衣成人在线| 电影亚洲精品噜噜在线观看| 插插插亚洲综合网| 男人天堂综合| 日韩精品自拍偷拍| 久久精品久久久久久久| 一区二区视频在线| 一本色道久久99精品综合| 精品无人乱码| 日韩精品一区二区三区在线播放| 精品一区二区无码| 亚洲成人免费av| 99成人在线观看| 91日韩在线专区| 丰满人妻一区二区三区大胸| 奇米777欧美一区二区| 青青草精品视频在线| 亚洲电影影音先锋| 欧美精品一区在线| 国产精品115| 51精品国产人成在线观看 | 国产精品亚洲美女av网站| 懂色av一区| 久久久精品美女| 岛国视频免费在线观看| 亚洲精品av在线| 亚洲第一天堂影院| 欧美亚洲日本一区| 国产91精品一区| 亚洲成人动漫精品| 久久久久久蜜桃| 亚洲男同1069视频| 我要看一级黄色录像| av爱爱亚洲一区| 国产a√精品区二区三区四区| 国产真实精品久久二三区| 天堂一区在线观看| 麻豆91在线观看| av视屏在线播放| 日日摸夜夜添夜夜添精品视频 | 成人黄色片在线观看 | 久久狠狠高潮亚洲精品| 一区二区三区在线视频观看| 国产又黄又粗又猛又爽的| 日本一区二区高清| 欧美 日韩 国产 成人 在线观看 | 色猫猫国产区一区二在线视频| 国产无码精品久久久| 亚洲午夜久久久| 国产在线观看免费视频今夜| 亚洲国产成人av网| 国产又粗又硬又长又爽| 国产精品国模大尺度视频| 最近中文字幕免费视频| 国产人久久人人人人爽| 九九热免费在线| 中文字幕综合网| 国产黄色小视频网站| 亚洲免费av观看| 国产亚洲精品女人久久久久久| 亚洲国产综合人成综合网站| 久久久久香蕉视频| 精品国产成人在线| 三级网站在线播放| 欧美日韩日日骚| 国产精品亚洲欧美在线播放| 欧美美女网站色| 精品国产无码一区二区三区| 精品国产伦理网| 三级视频在线| 综合激情国产一区| 国产秀色在线www免费观看| 九九精品视频在线观看| 91九色国产在线播放| 欧美一级免费视频| 国产人妖一区| 成人动漫在线观看视频| 爽爽窝窝午夜精品一区二区| 青娱乐国产91| 91日韩免费| 国产aaa免费视频| 久久精品一区二区国产| 久热精品在线观看视频| 成人精品亚洲人成在线| 日本在线观看网址| 欧美日韩免费一区| 国产黄色av网站| 在线观看国产精品日韩av| av在线私库| 成人久久一区二区三区| 国产九一精品| 僵尸世界大战2 在线播放| 久久国产精品色| 欧美高清性xxxx| 亚洲国产精品影院| 91在线视频国产| 一本色道久久综合亚洲精品小说| 欧美videossex| 91情侣偷在线精品国产| 国产尤物久久久| 男女私大尺度视频| 国产精品18久久久久| 中文字幕第69页| 在线观看亚洲专区| 污污视频在线免费看| 欧美国产第一页| 亚洲福利影视| 日韩伦理一区二区三区av在线| 99视频一区| wwwxx日本| 亚洲精品国产a| 国产一区二区在线不卡| 在线日韩欧美视频| 欧美va在线| 欧美日韩精品一区| 午夜在线观看免费一区| 亚洲精品在线视频免费观看| 亚洲午夜久久久久久久久久久| 国产手机精品视频| 精品久久久999| 日韩五码电影| 综合操久久久| 久久国产精品一区二区| 国产成人在线网址| 欧美精品丝袜中出| 欧美成人三区| 91九色在线视频| 首页国产精品| 中文字幕资源在线观看| 国产精品久久久久婷婷二区次| 亚洲一级视频在线观看| 中文字幕久久久av一区| 精品久久99| 在线观看成人免费| 国产成人在线影院| 免费中文字幕视频| 日韩美女视频一区二区在线观看| 色呦呦网站在线观看| 国产伦理久久久| 午夜在线a亚洲v天堂网2018| 无码h肉动漫在线观看| 日本电影亚洲天堂一区| 999国产在线视频| 成人精品久久久| 欧美日韩少妇| 水蜜桃av无码| 一本色道久久综合亚洲91| 成人午夜在线观看视频| 成人羞羞国产免费| 欧美精品三级| 中文字幕免费高清视频| 在线亚洲一区二区| 色大18成网站www在线观看| 91高跟黑色丝袜呻吟在线观看| 精品福利电影| 乐播av一区二区三区| 欧美群妇大交群的观看方式| 日本资源在线| 免费看国产精品一二区视频| 欧美96一区二区免费视频| 手机在线中文字幕| 亚洲成人精品在线| 韩国三级一区| 国产又粗又硬又长| eeuss国产一区二区三区| 无码任你躁久久久久久久| 少妇av一区二区三区| 国产精品videossex| 黄色一级大片在线观看| 最新国产成人在线观看| 五月天婷婷视频| 91精品久久久久久| 中文在线不卡| 久久精品亚洲a| 日韩精品视频在线观看网址| 四虎永久精品在线| 婷婷五月综合缴情在线视频| 国产日韩av一区| 99在线观看免费| 国产91精品最新在线播放| 欧美日韩91| 制服 丝袜 综合 日韩 欧美| 日韩欧美中文字幕制服| 国产亚洲一区二区手机在线观看 |