黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

python wsgiref源碼解析

瀏覽:6日期:2022-06-28 10:32:38

python web開發中http請求的處理流程通常是: web-browser , web-server , wsgi 和 web-application四個環節, 我們學習過基于bottle實現的web-application,也學習了http.server。再完成python3源碼中自帶的wsgiref的庫,就可以拼接最后一個環節wsgi。本文會分下面幾個部分:

wsgi相關概念 cgi示例 wsgiref源碼 wsgi小結 小技巧 wsgi 相關概念CGI

CGI(Common Gateway Interface)通用網關接口。1993年由美國NCSA(National Center for Supercomputing Applications)發明。它具有簡單易用、語言無關的特點。雖然今天已經少有人直接使用CGI進行編程,但它仍被主流的Web服務器,如Apache、IIS、Nginx等廣泛支持。

python wsgiref源碼解析

CGI提供了一種接口規范,可以讓應用程序, 一般是各種腳本語言,比如perl, php, python等來擴展web服務,讓服務動態起來。

WSGI

WSGI(Web Server Gateway Interface)web服務網關接口。是web服務和web應用程序之間的接口規范,在PEP3333中提出。

python wsgiref源碼解析

wsgi讓應用程序和web服務之間解耦,應用程序只需要遵守規范,就可以在各種不同的web服務部署運行。比如上圖中,基于flask/django實現的應用程序可以使用gunicorn部署,也可以使用nginx+uwsgi部署。

ASGI

ASGI(Asynchronous Server Gateway Interface) 異步服務器網關接口。ASGI繼承自wsgi,旨在在具有異步功能的Python Web服務器,框架和應用程序之間提供標準接口。ASGI具有WSGI向后兼容性實現以及多個服務器和應用程序框架。

python wsgiref源碼解析

wsgi中使用請求響應模型,每個請求可以同步獲得一個響應。在ASGI中,請求的響應變成異步實現,一般用于websocket協議。(asgi的內容,涉及異步實現,本文就不多介紹)

cgi 示例

單純的概念理解比較難。下面我們配合示例一起來學習,先從CGI開始。

http 模塊提供了一個簡單的文件目錄服務:

python3 -m http.serverServing HTTP on :: port 8000 (http://[::]:8000/) ...

這個服務只有靜態的展示功能,我們可以利用cgi擴展一個動態功能。

cgi腳本

創建cgi-bin目錄,這是CGI中約定的目錄名稱。然后編寫 hello.py, 代碼如下:

#!/usr/bin/env pythonimport timeimport sqlite3import osDB_FILE = 'guests.db'def init_db():pass # 詳情請見附件def update_total(ts):pass # 詳情請見附件print(’<html>’)print(’<head>’)print(’<meta charset='utf-8'>’)print(’<title>Hello Word!</title>’)print(’</head>’)print(’<body>’)print(’<h2>Hello Python!</h2>’)if not os.path.exists(DB_FILE):init_db()total = update_total(time.time())print(f’total guest: {total}!’)print(’</body>’)print(’</html>’)

為了代碼簡潔,省略了db操作部分的具體實現。還需要給腳本可執行權限:

源碼在這里

chmod 755 hello.py

./hello.py<html><head><meta charset='utf-8'><title>Hello Word!</title></head><body><h2>Hello Python!</h2>total guest: 4!</body></html>

啟動http.server中的cgi服務:

python -m http.server --cgi

注意后面的 --cgi 參數,讓服務使用cgi-handler。啟動后使用 curl 訪問:

curl -v http://127.0.0.1:8000/cgi-bin/hello.py* Trying 127.0.0.1...* TCP_NODELAY set* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#0)> GET /cgi-bin/hello.py HTTP/1.1> Host: 127.0.0.1:8000> User-Agent: curl/7.64.1> Accept: */*>* HTTP 1.0, assume close after body< HTTP/1.0 200 Script output follows< Server: SimpleHTTP/0.6 Python/3.8.5< Date: Sun, 31 Jan 2021 13:09:29 GMT< <html>< <head>< <meta charset='utf-8'>< <title>Hello Word!</title>< </head>< <body>< <h2>Hello Python!</h2>< total guest: 5! # 訪客數< </body>< </html>* Closing connection 0

可以看到 hello.py 正確執行,訪客數+1。因為數據存儲在db中,重啟服務仍然有效。

cgi服務實現

cgi的實現,主要就是下面的代碼:

# http.serverclass CGIHTTPRequestHandler(SimpleHTTPRequestHandler): def run_cgi(self): import subprocess cmdline = [scriptfile] if self.is_python(scriptfile): interp = sys.executable cmdline = [interp, ’-u’] + cmdline if ’=’ not in query: cmdline.append(query) try: nbytes = int(length) except (TypeError, ValueError): nbytes = 0 p = subprocess.Popen(cmdline,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,env = env) if self.command.lower() == 'post' and nbytes > 0: data = self.rfile.read(nbytes) # throw away additional data [see bug #427345] while select.select([self.rfile._sock], [], [], 0)[0]: if not self.rfile._sock.recv(1): break stdout, stderr = p.communicate(data) self.wfile.write(stdout) p.stderr.close() p.stdout.close() status = p.returncode

可見cgi的實現就是:

使用subprocess.Popen新開了一個進程去執行腳本 重定向腳本的輸出到當前socket的wfile,也就是http請求的返回上

代碼也驗證了為什么需要授予 hello.py 的可執行權限。

從例子可以了解到http.server專注于提供http服務,app.py專注于業務功能,兩者通過cgi進行銜接。

wsgiref

wsgiref是python自帶的wsgi的實現參考(reference), 主要代碼結構:

文件 描述 handlers.py wsgi實現 headers.py 管理http-header simple_server.py 支持wsgi的http服務 util.py&&validator.py 工具和驗證器

WSGIServer的代碼:

class WSGIServer(HTTPServer): '''BaseHTTPServer that implements the Python WSGI protocol''' application = None def server_bind(self): '''Override server_bind to store the server name.''' HTTPServer.server_bind(self) self.setup_environ() def setup_environ(self): # 初始化環境變量 # Set up base environment env = self.base_environ = {} env[’SERVER_NAME’] = self.server_name env[’GATEWAY_INTERFACE’] = ’CGI/1.1’ env[’SERVER_PORT’] = str(self.server_port) env[’REMOTE_HOST’]=’’ env[’CONTENT_LENGTH’]=’’ env[’SCRIPT_NAME’] = ’’ def get_app(self): return self.application def set_app(self,application): # 注入application的class,注意是class self.application = application

WSGIServer并不復雜,繼承自http-server,接受application注入,就把web-server和we-application銜接起來。銜接后的動作,則是老規矩,交給HTTPRequestHandler去實現。同時wsgi服務多了一個準備env的動作,約定了一些wsgi的環境變量。

class WSGIRequestHandler(BaseHTTPRequestHandler): server_version = 'WSGIServer/' + __version__ def get_environ(self): pass def handle(self): '''Handle a single HTTP request''' self.raw_requestline = self.rfile.readline(65537) if len(self.raw_requestline) > 65536: ... self.send_error(414) return if not self.parse_request(): # An error code has been sent, just exit return handler = ServerHandler( self.rfile, self.wfile, self.get_stderr(), self.get_environ(), multithread=False, ) # 創建新的業務handler handler.request_handler = self handler.run(self.server.get_app()) # 創建application對象

WSGIRequestHandler覆蓋了handler,處理完成http協議(parse_request)后, 又做了四個動作:

創建environ 創建ServerHandler對象 創建app對象 運行app

environ處理主要是把http請求的header信息附帶在wsgi-server的環境變量上:

def get_environ(self): env = self.server.base_environ.copy() # wsgi-server的環境變量 env[’SERVER_PROTOCOL’] = self.request_version env[’SERVER_SOFTWARE’] = self.server_version env[’REQUEST_METHOD’] = self.command ... host = self.address_string() if host != self.client_address[0]: env[’REMOTE_HOST’] = host env[’REMOTE_ADDR’] = self.client_address[0] if self.headers.get(’content-type’) is None: env[’CONTENT_TYPE’] = self.headers.get_content_type() else: env[’CONTENT_TYPE’] = self.headers[’content-type’] length = self.headers.get(’content-length’) if length: env[’CONTENT_LENGTH’] = length for k, v in self.headers.items(): k=k.replace(’-’,’_’).upper(); v=v.strip() if k in env: continue # skip content length, type,etc. if ’HTTP_’+k in env: env[’HTTP_’+k] += ’,’+v # comma-separate multiple headers else: env[’HTTP_’+k] = v return env

ServerHandler對象的創建,接受輸入/輸出/錯誤,以及環境變量信息:

class ServerHandler(BaseHandler): def __init__(self,stdin,stdout,stderr,environ, multithread=True, multiprocess=False ): self.stdin = stdin self.stdout = stdout self.stderr = stderr self.base_env = environ self.wsgi_multithread = multithread self.wsgi_multiprocess = multiprocess ...

重點在ServerHandler的run函數:

class BaseHandler: def run(self, application): '''Invoke the application''' # Note to self: don’t move the close()! Asynchronous servers shouldn’t # call close() from finish_response(), so if you close() anywhere but # the double-error branch here, you’ll break asynchronous servers by # prematurely closing. Async servers must return from ’run()’ without # closing if there might still be output to iterate over. ... self.setup_environ() self.result = application(self.environ, self.start_response) self.finish_response() ...

關鍵的3個步驟:

setup_environ 繼續構建環境變量 接受application處理http請求的返回 完成http響應

setup_environ對env進行了進一步的包裝,附帶了請求的in/error,這樣讓使用env就可以對http請求進行讀寫。

def setup_environ(self): '''Set up the environment for one request''' env = self.environ = self.os_environ.copy() self.add_cgi_vars() # 子類實現 self.environ.update(self.base_env) env[’wsgi.input’] = self.get_stdin() # 注意沒有stdout env[’wsgi.errors’] = self.get_stderr() env[’wsgi.version’] = self.wsgi_version env[’wsgi.run_once’] = self.wsgi_run_once env[’wsgi.url_scheme’] = self.get_scheme() env[’wsgi.multithread’] = self.wsgi_multithread env[’wsgi.multiprocess’] = self.wsgi_multiprocess if self.wsgi_file_wrapper is not None: env[’wsgi.file_wrapper’] = self.wsgi_file_wrapper if self.origin_server and self.server_software: env.setdefault(’SERVER_SOFTWARE’,self.server_software)

env的處理過程,可以理解成3步:1)附加server的運行信息 2)附加請求的http頭(協議信息) 3)附加請求的流信息。env,可以換個說法就是http請求的所有上下文環境。

application還接收一個回調函數start_response,主要是按照http協議的規范,生成響應狀態和response_header:

def start_response(self, status, headers,exc_info=None): '''’start_response()’ callable as specified by PEP 3333''' self.status = status self.headers = self.headers_class(headers) status = self._convert_string_type(status, 'Status') assert len(status)>=4,'Status must be at least 4 characters' assert status[:3].isdigit(), 'Status message must begin w/3-digit code' assert status[3]==' ', 'Status message must have a space after code' return self.write

application對請求的處理:

def demo_app(environ,start_response): from io import StringIO stdout = StringIO() print('Hello world!', file=stdout) print(file=stdout) # http請求及環境 h = sorted(environ.items()) for k,v in h: print(k,’=’,repr(v), file=stdout) # 回調寫入http_status, response_headers start_response('200 OK', [(’Content-Type’,’text/plain; charset=utf-8’)]) # 返回處理結果response_body return [stdout.getvalue().encode('utf-8')]

響應仍然由ServerHandler寫入:

def finish_response(self): if not self.result_is_file() or not self.sendfile(): for data in self.result: self.write(data) self.finish_content()

可以使用下面命令測試這個流程:

python -m wsgiref.simple_serverServing HTTP on 0.0.0.0 port 8000 ...127.0.0.1 - - [31/Jan/2021 21:43:05] 'GET /xyz?abc HTTP/1.1' 200 3338wsgi 小結

簡單小結wsgi的實現。在http請求的處理流程web-browser <-> web-server <-> wsgi <-> web-application中,體現了分層的思想,每層做不同的事情:

web-server處理http/tcp協議,線程/進程的調度等底層實現 wsgi承上啟下,接受http請求,調用applicaiton處理請求,完成響應 application處理上層業務邏輯小技巧

在wsgiref代碼中一樣有各種小的技巧, 學習后可以讓我們的代碼更pythonic。

環境變量都這樣設置:

def setup_environ(self): # Set up base environment env = self.base_environ = {} env[’SERVER_NAME’] = self.server_name env[’GATEWAY_INTERFACE’] = ’CGI/1.1’ ...

我之前大概都是這樣寫:

def setup_environ(self): self.base_environ = {} self.base_environ[’SERVER_NAME’] = self.server_name self.base_environ[’GATEWAY_INTERFACE’] = ’CGI/1.1’

對比后,可以發現前面的寫法更簡潔一些。

比如流的持續寫入:

def _write(self,data): result = self.stdout.write(data) if result is None or result == len(data): return from warnings import warn warn('SimpleHandler.stdout.write() should not do partial writes', DeprecationWarning) while True: data = data[result:] # 持續的寫入,直到完成 if not data: break result = self.stdout.write(data)

比如header的處理,實際上是把數組當作字典使用:

class Headers: '''Manage a collection of HTTP response headers''' def __init__(self, headers=None): headers = headers if headers is not None else [] self._headers = headers # 內部存儲使用數組 def __setitem__(self, name, val): '''Set the value of a header.''' del self[name] self._headers.append( (self._convert_string_type(name), self._convert_string_type(val))) .... def __getitem__(self,name): '''Get the first header value for ’name’ Return None if the header is missing instead of raising an exception. Note that if the header appeared multiple times, the first exactly which occurrence gets returned is undefined. Use getall() to get all the values matching a header field name. ''' return self.get(name) def get(self,name,default=None): '''Get the first header value for ’name’, or return ’default’''' name = self._convert_string_type(name.lower()) for k,v in self._headers: if k.lower()==name: return v return default

這樣對 Content-Type: application/javascript; charset=utf-8 這樣的值,可以使用下面方式使用:

if self.headers.get(’content-type’) is None: env[’CONTENT_TYPE’] = self.headers.get_content_type()else: env[’CONTENT_TYPE’] = self.headers[’content-type’]

為什么用數組,而不是用字典呢?我猜測是因為header的特性是數據多為讀操作。

以上就是python wsgiref源碼解析的詳細內容,更多關于python wsgiref源碼的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 农村村妇真实偷人视频 | 伊人春色在线视频 | 欧美精品videos另类日本 | 大青草久久久蜜臀av久久 | 日韩国产欧美视频 | 亚洲精品国产视频 | 亚洲一区二区色 | 国产精品久久久久久久免费观看 | 日韩精品一区二区三区四区视频 | 久久久一本精品99久久精品66 | 国产免费一区二区三区免费视频 | 国产精品久久久一区二区三区网站 | 日韩伦理大全 | 久久国产精品首页 | 一级黄色免费片 | 成人国产片| 久草在线青青草 | 国产精品一级二级三级 | 久久精品日产第一区二区 | 中文字幕视频网 | 国产亚洲精品精品国产亚洲综合 | 精品人伦一区二区三区蜜桃视频 | 91成人福利视频 | 成人精品gif动图一区 | 亚洲第一极品精品无码 | 樱花av在线 | 国产精品美女毛片真酒店 | 爱豆国产剧免费观看大全剧集 | 中文字幕一区二区在线观看 | 关秀媚三级露全乳视频 | 日本欧美国产一区二区三区 | 日本久久免费 | 国产精品国语对白 | 精品香蕉久久久午夜福利 | 欧美成人一区二区三区在线观看 | 轻轻色在线观看 | 成人在线免费播放 | 青青色在线观看 | 亚洲成av人片在线观看www | 五月丁香六月综合缴情在线 | 一本色道久久亚洲综合精品蜜桃 | 乖女从小调教h尿便器小说 关秀媚三级 | 视色在线 | 密臀av在线| 久草视频2 | 永久看看免费大片 | 国产一二视频 | 国产男女猛烈无遮掩视频免费网站 | 欧美日激情 | 久久叉 | 日韩三级视频在线播放 | 国产福利不卡 | 日韩成人一区二区三区在线观看 | 久久久精品成人免费观看 | 97在线免费 | 少妇大叫好爽受不了午夜视频 | 欧美一级片观看 | 色偷偷色偷偷色偷偷在线视频 | 少妇野外性xx老女人野外性xx | 欧美大片免费看 | 亚洲 欧美 偷自乱 图片 | 日本wwww视频 | 肉版如懿传高h | 久久综合伊人 | 免费的黄色片 | 欧美在线观看你懂的 | 欧美爽爽爽| 黄网站永久免费 | 国产在线高清 | 可以免费看毛片的网站 | 成人在线观 | 亚洲欧美日韩一区在线观看 | 正在播放凉森玲梦88av | 中文字幕亚洲精品一区 | 久久伊人免费 | 国产一级二级三级在线 | 国产网站在线看 | 日日夜夜网站 | 欧美色图综合网 | 日韩黄色大片 | 4虎tv| 国产综合在线视频 | av永久天堂一区二区三区 | 中文字幕一路线二路线三路线 | 精品国产一区二区三区蜜殿 | 黄瓜视频成人 | 初尝黑人巨砲波多野结衣 | 变态 另类 国产 亚洲 | 日韩精品一区二区在线观看 | 自偷自拍亚洲 | 国产第一福利影院 | 国产精品久久久久久久一区二区 | 国产免费不卡视频 | 免费无码又爽又刺激高潮的视频 | 四虎色网| 黄色免费一级视频 | 亚洲最大成人在线观看 | 欧美激情影院 | 亚洲欧美另类一区 | av播放网站| 欧美不卡一区二区三区 | wwwxx国产 | 欧美精品成人a区在线观看 欧美精品成人久久 | 亚洲午夜精品久久久 | 国产成人欧美一区二区三区八 | 一二三区视频 | 国产精品一线 | 亚洲精品乱码久久久久久蜜桃麻豆 | 色综合色综合色综合色欲 | 777米奇影视第四色 韩产日产国产欧产 | 成年性生交大片免费看 | 不卡欧美| 激情97综合亚洲色婷婷五 | 日韩在线免费 | 免费在线日韩av | 色综合久久久久综合体桃花网 | 亚洲成人在线观看视频 | 色婷婷久久一区二区三区麻豆 | 色婷婷色 | 裸体性做爰免费视频网站 | 任你躁x7x7x7x7在线观看 | 91爱视频 | 操碰视频 | 性史性dvd影片农村毛片 | 中文精品一区二区三区四区 | 国产一级免费 | 深夜福利视频免费观看 | 亚洲视频网站在线 | 亚欧日韩av | 国产精品永久免费 | 综合自拍亚洲综合图区高清 | 亚洲日韩一区二区三区 | 欧美女同网站 | 丁香婷婷在线观看 | 欧美一级欧美三级 | 日韩av福利 | 国产成人美女视频网站 | 伊人婷婷综合 | 日韩精品卡通动漫网站 | 性一交一乱一色一情丿按摩 | 91国内自产精华天堂 | 4438xx亚洲最大五色丁香软件 | 日本在线观看中文字幕 | 99影视网 | 一级aaa级毛片午夜在线播放 | 亚洲熟妇国产熟妇肥婆 | 国产偷国产偷精品高清尤物 | 国产成人av无码精品 | 人人看人人干 | 日产欧产va高清 | 97久久国产| 国产精品久久久久久久久久妞妞 | 欧美一区二区三区国产 | 久草一区二区 | 国产免费啪啪 | 亚洲一本在线观看 | 免费的a级片 | 久久99精品久久久久婷综合 | 精品视频九九 | 日韩成人av毛片 | 丰满岳妇乱一区二区三区 | 精品成人国产 | 少妇被爽到高潮喷水久久欧美精品 | 色妞av永久一区二区国产av开 | 全黄激性性视频 | 另类天堂网 | 2020久久超碰国产精品最新 | 大学生精油按摩做爰hd | 免费黄色网址大全 | 最新黄色在线 | 亚洲国产人午在线一二区 | 亚洲3dmax成人 | 少妇愉情理仑片高潮日本 | 性折磨bdsm欧美激情另类 | 成人香蕉网 | 亚洲人成网站999久久久综合 | 日本成人黄色片 | 欧美视频在线观看一区二区三区 | 日韩毛片基地 | 成人精品一区二区三区网站 | 精品手机在线 | 97se亚洲国产综合自在线观看 | 伊人99re | 日韩精品第一区 | 在线天堂新版资源www在线 | 亚洲最大成人网4388xx | 免费观看亚洲视频 | 少妇被爽到高潮喷水久久欧美精品 | 制服丝袜一区二区三区 | 天天躁日日躁狠狠躁视频2021 | 成人亚洲一区 | 免费欧美黄色 | 一级作爱片 | 亚洲天码中字一区 | 日本www在线播放 | 日本高清一区免费中文视频 | 天天射天天舔 | 国产第三区 | 黄大色黄女片18第一次 | 深夜福利啪啪片 | 日本高清视频免费观看 | 久久精品tv| 亚洲精品色在线网站 | 俺去俺来也www色官网cms | 色综合五月婷婷 | 欧美性猛交xxx乱大交3 | 三级久久久 | 精品国产乱码久久久久久夜甘婷婷 | 污污在线免费观看 | 69xx在线观看视频 | 国产熟睡乱子伦午夜视频 | 黄色免费视频在线观看 | 美女张开腿让人桶 | 性色av网站 | 国产精品久久久久久久久免费软件 | 亚洲精品影院在线观看 | 国产热の有码热の无码视频 | 消息称老熟妇乱视频一区二区 | 亚洲国产成人av毛片大全 | 岛国在线视频 | 欧美一级色片 | 国产九区 | 99热久久是国产免费66 | 亚洲日本中文字幕在线 | 美国美女群体交乱 | 亚洲美女福利 | 欧美一级激情 | 91黑丝在线观看 | 三区中文字幕 | 精品伦一区二区三区免费视频 | 强制中出し~大桥未久在线a | 99成人 | 国产精品爽到爆呻吟高潮不挺 | 一本一道波多野结衣av中文 | 免费无遮挡无码永久视频 | 国产精品久久亚洲 | 国模少妇一区二区三区 | 91精品国产综合久久福利 | 激情中文网 | 亚洲国产成人综合精品 | 三级色视频 | 久草在线资源福利 | 欧美黑人粗大xxxxbbbb | 欧美三日本三级三级在线播放 | 亚洲一区免费在线观看 | 中文在线最新版天堂8 | 久久国产欧美日韩精品图片 | 国产精品女主播 | jizz国产免费| 欧美日本国产精品 | 中文字幕丰满伦孑 | 成人免费看片粪便 | 最近中文字幕在线mv视频在线 | 成人性午夜免费网站蜜蜂 | 怡红院av久久久久久久 | 国产无套白浆一区二区 | 狠狠做六月爱婷婷综合aⅴ 狠狠做深爱婷婷综合一区 狠久久 | 国产亚洲性欧美日韩在线观看软件 | 久久精品无码av | 一边cao一边粗话打奶视频 | 豆花av在线 | 中文字幕日日 | 国产精品theporn | 夜夜操操操 | 亚洲国产精品久久久久秋霞不卡 | 激情欧美亚洲 | 欧美久久一级 | 少妇厨房愉情理伦bd在线观看 | 久久成人av| 浪潮av一区二区三区 | youporn国产在线观看 | 亚洲黄av| 国产视频成人 | 精品国产一区二区三区不卡蜜臂 | 成人国产免费视频 | 哺乳援交吃奶在线播放 | 91久色视频 | 日韩三级视频 | 色香影视| 4438ⅹ亚洲全国最大色丁香 | aaaaav| 色五月丁香六月欧美综合 | 无人在线观看的免费高清视频 | 国产精品久久久久久人妻精品 | 国产91在线播放9色不卡 | 国内精品久久久久久久日韩 | 国产乱配视频免费观看 | 国产又粗又猛又爽又黄的视频p站 | 一色屋免费视频 | 国产精品亚洲欧美大片在线看 | 国产艳妇av在线观看果冻传媒 | 亚洲图片在线视频 | 日产av在线播放 | 久久不见久久见免费视频7 18禁黄久久久aaa片广濑美月 | 亚洲色偷偷av男人的天堂 | 免费在线播放黄色片 | 日韩不卡在线 | 日本乱码一区二区三区芒果 | 日日摸天天做天天添天天欢 | 91精品国产人妻国产毛片在线 | 日韩三级av在线 | 尤物99国产成人精品视频 | 99精产国品一二三产区网站 | 精品国产免费久久久久久婷婷 | 成人午夜免费在线 | 国产午夜福利精品一区二区三区 | 欧美性第一页 | 日韩91av | 国产精品美女视频 | 张警花视频99精品视频 | 99精品热视频 | 国产成a人亚洲精品无码久久网 | 国产毛片又黄又爽 | 澳门免费av | 麻豆回家视频区一区二 | 特级毛片爽www免费版 | 亚洲1区在线观看 | 美女黄色av| 不卡的av在线播放 | 久久亚洲伊人 | 国产精品伦一区二区 | 综合 欧美 亚洲日本 | 丰满大乳一级淫片免费播放 | 国产一级做a爰片久久毛片男 | 久久久久人妻精品一区三寸蜜桃 | 亚洲免费色图 | 国产天码青椒老色批青椒影视 | 少妇伦子伦精品无吗 | 久久综合九色综合97网 | 日韩av成人在线 | 女人被狂躁c到高潮 | 日韩成人av在线播放 | 99热这里只有精品首页 | 男人的天堂av网 | 精品久久久久久久久久国产潘金莲 | 亚洲xx站 | 国产高潮刺激叫喊视频 | 天天爽天天爱 | 久久久国产精品亚洲一区 | 欧美牲交a欧美牲交aⅴ免费真 | 一区二区三区乱码在线 | 欧洲 | wwwjizz欧美 | 秋霞影院午夜老牛影院 | 97人人人 | 久久99国产综合精品免费 | 亚洲天堂性 | 国产精品视频一区国模私拍 | 97人人模人人爽人人喊网 | 99久久精品免费看国产免费粉嫩 | 无码人妻一区二区三区免费视频 | 潮喷失禁大喷水aⅴ无码 | 国产高清在线视频 | 久久精品天天中文字幕人妻 | 久久久久无码精品国产h动漫 | 亚洲男人的天堂一区二区 | 男女啪啪免费体验区 | 蜜臀av午夜一区二区三区 | 欧美日韩久久 | 男女一边摸一边做爽视频 | 国产清纯白嫩高中生在线播放 | 免费观看全黄做爰的视频 | 国产在线观看一区 | 色一情一狱一爱一乱 | 色综合天天网 | 久久tv| 91久久久精品国产一区二区蜜臀 | 三级黄色毛片视频 | 日女人免费视频 | 免费看av的网址 | 亚洲午夜片 | 国产主播中文字幕 | 亚洲国产av一区二区三区 | 青青草这里只有精品 | 亚洲成人免费视频在线 | 日本888xxxx | 久久黄网 | 两性色午夜免费视频 | 亚洲色大成网站www 亚洲色大成网站www久久九九 | 日本理论片| 日出水了特别黄的视频 | 五月天激情开心网 | 90岁老太婆乱淫 | 亚洲永久免费网站 | 国产精品视频网站 | 久久久久se色偷偷亚洲精品av | 91麻豆精品91久久久久久清纯 | 人人爱国产 | 爱情岛论坛亚洲自拍 | 欧美性折磨bdsm激情另类视频 | 日韩亚洲欧美中文高清在线 | 中年两口子高潮呻吟 | 国产精品主播在线 | 亚洲成av人片天堂网无码】 | 夜夜骚av| 成人av网站免费 | 快色网站 | 日韩欧美国产网站 | 亚洲va欧美va人人爽 | 欧美吻胸吃奶大尺度 | 国产乱码精品一区二区三区中文 | 精品久久久久久无码免费 | 在线视频 亚洲 | 国产农村妇女aaaaa视频 | 日韩和一区二区 | 亚洲人成无码网站久久99热国产 | 少妇视频在线 | 国产成人艳妇aa视频在线 | 香蕉视频免费 | 18禁美女裸身无遮挡免费网站 | 亚洲一区二区在线观看视频 | 国产色在线观看 | 日本高清有码视频 | 色爽爽爽爽爽爽爽爽 | 无码国产69精品久久久久网站 | 91爱啪啪| 朝鲜交性又色又爽又黄 | 国产又粗又猛又爽又黄的免费视频 | 91丝袜美女| jizz网站 | 国产主播啪啪 | www狠狠操| 国产又粗又长又黄的视频 | 亚洲 欧美 日韩在线 | 国产69精品久久99卡顿的解决方法 | 九草视频在线观看 | 极品少妇被黑人白浆直流 | 免费女同毛片在线观看 | 两个女人互添下身爱爱 | 国产狂做受xxxxx高潮 | 奇米影视777久色在线 | 亚洲国产精品99久久久久久久久 | 精品日韩中文字幕 | 两性色午夜视频免费播放 | 国产真人真事毛片 | 中文字幕在线观看亚洲视频 | 97视频免费在线观看 | 欧美精品小视频 | 美女裸体视频永久免费 | 日本边添边摸边做边爱的网站 | 国产小视频自拍 | 好av| 色综合久久天天综合网 | 国产一区在线视频观看 | 色姑娘久 | 国产做a爰片久久毛片a片美国 | 日本人三级 | 99热1| 午夜久久 | 国产人碰人摸人爱视频 | 国产女人毛片 | 亚洲国产精品va在线看黑人动漫 | 色哟哟av | 91色乱码一区二区三区 | 97免费在线观看视频 | 99re6热在线精品视频播放 | 黑森林福利视频导航 | 亚洲线精品一区二区三区八戒 | 欧美jjzz| 国产无套免费网站69 | 91亚洲精华国产精华精华液 | www.色94色.com| a级黄片毛片| 国产又粗又猛又大爽又黄老大爷 | 免费视频91蜜桃 | 直接看毛片| 国产欧美一区二区在线观看 | 免费在线观看不卡av | 国产精品久线在线观看 | 国产精品一区二区6 | 日本理论片在线 | 亚洲精品中文字幕一区二区三区 | 欧日韩在线观看 | 久久www免费人成人片 | 一本色道久久综合狠狠躁邻居 | 成人免费毛片足控 | 国产欧美一区二区精品性 | 少妇高潮太爽了在线视频 | 日韩伦理视频 | 欧美亚洲第一页 | 久久久久久久久久久大尺度免费视频 | 蒂法3d一区二区三区 | 桥本有菜免费av一区二区三区 | 国精品人妻无码一区免费视频电影 | 91麻豆产精品久久久久久夏晴子 | 国产在线国偷精品免费看 | 国产视频网站在线观看 | 国产无遮挡裸体免费直播 | 久久久久久久久久网站 | 婚后打屁股高h1v1调教 | 欧美在线免费观看视频 | 麻豆精品乱码一二三区别蜜臀在线 | 久久久久中文字幕亚洲精品 | 十八禁视频网站在线观看 | 上床视频在线观看 | 嫩草视频在线观看免费 | 日韩国产一区二区三区 | 99re视频精品 | 5678少妇影院 | 四虎激情 | 久久视奸 | 麻豆av片 | 拨开少妇两片肥嫩的肉 | 乱大交做爰xxxⅹ性 乱荡少妇xxhd | 日韩在线播放视频 | 国产色播av在线 | 日产精品高潮呻吟av久久 | 日本囗交一级视频 | www.成人av.com| 国产嫩草在线观看视频 | 国产精品无套呻吟在线 | 亚洲免费色视频 | 欧美三级乱人伦电影 | 日本xx视频免费观看 | 欧美激情精品久久久久久变态 | 老湿机69福利 | 亚洲人成人天堂 | 午夜激情影院在线观看 | 毛片直接看 | 张津瑜国内精品www在线 | 国产一区二区三区 | 日韩一区二区三区在线看 | 亚洲国产综合色产精品色在线 | 91香蕉嫩草| 综合激情网站 | 爱情岛论坛亚洲品质自拍 | 亚洲地区一二三色 | 国产在线h | caopor超碰| 最新国产在线视频 | 人人爽人人做 | 国产精品一区二区三区视频免费 | 两人做人爱费视频午夜 | 在线日本看片免费人成视久网 | 东北女人毛多水多牲交视频 | 日韩色图片 | 成人性视频sm. | 国产成人精品手机在线观看 | 国产精品久久久久久久久妇女 | 日韩激情毛片 | av午夜久久蜜桃传媒软件 | 张津瑜国内精品www在线 | 国产麻豆一区二区三区在线观看 | 午夜视频国产 | av男人的天堂网 | 亚洲精品9999久久久久无码 | 哪里可以看免费毛片 | av在线h| 亚洲精品在线免费播放 | 欧洲肉欲k8播放毛片 | xxxx少妇高潮毛片新婚之夜 | 三日本三级少妇三级99 | 亚洲综合无码久久精品综合 | 久久久精品成人免费观看 | 99久久久无码国产精品秋霞网 | 91视频h| 中文天堂在线观看 | 国产成人av在线影院 | 91在线观看. | 国产亚洲一区二区在线 | 少妇特黄a一区二区三区 | 日韩jizz| 少妇被躁爽到高潮无码人狍大战 | 伊人春色网 | 国产精品久久久久久亚洲 | 国产老女人乱淫免费可以 | 永久免费看mv网站入口亚洲 | 91九色网站 | 欧美日韩中文在线观看 | 国产理论片在线观看 | 操女网站 | 国产又黄又爽又刺激的免费网址 | 人妻丰满av无码久久不卡 | 爱情岛论坛亚洲品质自拍 | 欧美野外做受又粗又硬 | 国精品午夜福利视频不卡 | 中国特级黄色毛片 | 亚洲天堂性 | 国产女人呻吟高潮抽搐声 | 少妇人妻丰满做爰xxx | 欧美在线视频一区 | 肉肉av福利一精品导航 | 一区二区av在线 | 香蕉视频性 | 国产成人久久精品麻豆二区 | 国产在线视频资源 | 天海翼av | 又色又爽又激情的59视频 | 日韩射 | 国产亚洲精品无码成人 | 日韩欧美在线观看一区二区三区 | 国产精品久久久久久久久免费 | 欧美久久国产精品 | 人妻无码熟妇乱又伦精品视频 | 99精品小视频 | 国产毛片一区二区 | 日本久久久影视 | 欧美zoozzooz性欧美 | 国产精品多久久久久久情趣酒店 | 裸身美女无遮挡永久免费视频 | 小sao货水好多真紧h视频, | 日韩精品一区二区三区亚洲综合 | 中文字幕一区二区三区不卡 | 超碰伊人久久 | 天天拍天天干 | 99久久精品国产免费看 | 精品一区二区三区激情在线欧美 | 一二三不卡 | 亚洲乱码国产乱码精品精大量 | 午夜大片网 | 亚洲a成人片在线观看 | 国产精品a成v人在线播放 | 久久密av | 日本精品视频一区 | 91在线网 |