久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flask框架基础

發布時間:2024/4/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask框架基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 web的一些框架介紹

 Flask:短小精悍,內部沒有包含多少組件,但是第三方的組件是非常豐富的。

 Django:django是一個重武器,內部包含了非常多的組件:orm,form,modelForm,緩存,session等等

 Tornado:牛逼之處就是異步非阻塞框架和node.js

二 Flask的快速入門

 創建python虛擬環境:virtualenv 虛擬名

 安裝:pip install flask

 什么是werkzeug:Werkzeug是一個WSGI工具包,他可以作為一個Web框架的底層庫。官方的介紹說是一個 WSGI 工具包,它可以作為一個 Web 框架的底層庫,因為它封裝好了很多 Web 框架的東西,例如 Request,Response 等等

from werkzeug.wrappers import Request, Response@Request.application def hello(request):return Response('Hello World!')if __name__ == '__main__':from werkzeug.serving import run_simplerun_simple('localhost', 4000, hello) View Code

 基本使用:

from flask import Flask app = Flask(__name__)@app.route('/') def hello_world():return 'Hello World!'if __name__ == '__main__':app.run() View Code

 wsgi:使用werkzeug模塊實現的,還可以使用wsgiref實現。本質是導入socket實現的。

   一旦出現這個,監聽事件就開始了

 實例化Flask對象

  app.run():監聽用戶的請求,一旦有用戶的請求過來,就會直接執行用戶的__call__方法。

  flask的所有相關的組件全都存在flask文件下的,需要什么導入什么

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

 for_url:高級版的重定向

from flask import Flask,render_template,request,redirect,session,url_forapp = Flask(__name__) app.debug=True app.secret_key='fangshao' USERS = {1:{'name':'張桂坤','age':18,'gender':'','text':"當眼淚掉下來的時候,是真的累了, 其實人生就是這樣: 你有你的煩,我有我的難,人人都有無聲的淚,人人都有難言的苦。 忘不了的昨天,忙不完的今天,想不到的明天,走不完的人生,過不完的坎坷,越不過的無奈,聽不完的謊言,看不透的人心放不下的牽掛,經歷不完的酸甜苦辣,這就是人生,這就是生活。"},2:{'name':'主城','age':28,'gender':'','text':"高中的時候有一個同學家里窮,每頓飯都是膜膜加點水,有時候吃點咸菜,我們六科老師每天下課都叫他去辦公室回答問題背誦課文,然后說太晚啦一起吃個飯,后來他考上了人大,拿到通知書的時候給每個老師磕了一個頭"},3:{'name':'服城','age':18,'gender':'','text':"高中的時候有一個同學家里窮,每頓飯都是膜膜加點水,有時候吃點咸菜,我們六科老師每天下課都叫他去辦公室回答問題背誦課文,然后說太晚啦一起吃個飯,后來他考上了人大,拿到通知書的時候給每個老師磕了一個頭"}, } @app.route('/') def hello_world():return 'Hello World!'# @app.route('/index',methods=['GET']) # def index(): # user=session.get('user_info') # print(user) # if user: # return render_template('index.html',data=user,user_dict=USERS) # return redirect('/login') @app.route('/index',methods=['GET']) def index():user=session.get('user_info')if user:return render_template('index.html',data=user,user_dict=USERS)url=url_for('111')return redirect(url)@app.route('/detail/<int:nid>',methods=['GET']) def detail(nid):user=session.get('user_info')if not user:return redirect('/login')return render_template('detail.html',data=USERS[nid])@app.route('/login',methods=['GET','POST'],endpoint='111') def login():if request.method=='POST':user=request.form.get('user')pwd=request.form.get('pwd')if user=='fang' and pwd=='123':session['user_info']=userreturn redirect('/index')else:return render_template('login.html',msg='用戶名或密碼錯誤')return render_template('login.html')if __name__ == '__main__':app.run() View Code

三 配置文件

 開放封閉原則:對代碼的修改是封閉的,對配置文件的修改時開放的。

 app.debug=True:修改過后自動重啟項目

 app.secret_key='隨機設置字符串':全局設置session,Session, Cookies以及一些第三方擴展都會用到,

 app.config['debug']=True:修改過后自動重啟項目

 app.config:獲取當前app的所有配置

 app.config.from_object:導入文件的一個類,

  內部實現原理:導入時,將路徑由點分割

 配置文件的格式有:

flask中的配置文件是一個flask.config.Config對象(繼承字典),默認配置為:{'DEBUG': get_debug_flag(default=False), 是否開啟Debug模式'TESTING': False, 是否開啟測試模式'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None,'SECRET_KEY': None,'PERMANENT_SESSION_LIFETIME': timedelta(days=31),'USE_X_SENDFILE': False,'LOGGER_NAME': None,'LOGGER_HANDLER_POLICY': 'always','SERVER_NAME': None,'APPLICATION_ROOT': None,'SESSION_COOKIE_NAME': 'session','SESSION_COOKIE_DOMAIN': None,'SESSION_COOKIE_PATH': None,'SESSION_COOKIE_HTTPONLY': True,'SESSION_COOKIE_SECURE': False,'SESSION_REFRESH_EACH_REQUEST': True,'MAX_CONTENT_LENGTH': None,'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),'TRAP_BAD_REQUEST_ERRORS': False,'TRAP_HTTP_EXCEPTIONS': False,'EXPLAIN_TEMPLATE_LOADING': False,'PREFERRED_URL_SCHEME': 'http','JSON_AS_ASCII': True,'JSON_SORT_KEYS': True,'JSONIFY_PRETTYPRINT_REGULAR': True,'JSONIFY_MIMETYPE': 'application/json','TEMPLATES_AUTO_RELOAD': None,} View Code

  格式一:

app.config['DEBUG'] = TruePS: 由于Config對象本質上是字典,所以還可以使用app.config.update(...) View Code

  格式二:

app.config.from_pyfile("python文件名稱")如:settings.pyDEBUG = Trueapp.config.from_pyfile("settings.py")app.config.from_envvar("環境變量名稱")環境變量的值為python文件名稱名稱,內部調用from_pyfile方法app.config.from_json("json文件名稱")JSON文件名稱,必須是json格式,因為內部會執行json.loadsapp.config.from_mapping({'DEBUG':True}) View Code

  格式三:

app.config.from_object("python類或類的路徑")app.config.from_object('pro_flask.settings.TestingConfig')settings.pyclass Config(object):DEBUG = FalseTESTING = FalseDATABASE_URI = 'sqlite://:memory:'class ProductionConfig(Config):DATABASE_URI = 'mysql://user@localhost/foo'class DevelopmentConfig(Config):DEBUG = Trueclass TestingConfig(Config):TESTING = TruePS: 從sys.path中已經存在路徑開始寫 View Code

 settings.py默認路徑要放在當前項目的第一級目錄下面

? PS: settings.py文件默認路徑要放在程序root_path目錄,如果instance_relative_config為True,則就是instance_path目錄

四 路由系統

  • @app.route('/user/<username>')
  • @app.route('/post/<int:post_id>')
  • @app.route('/post/<float:post_id>')
  • @app.route('/post/<path:path>')
  • @app.route('/login', methods=['GET', 'POST'])

 路由比較特殊,:是基于裝飾器實現的,但是究其本質還是有add_url_rule實現的。

 裝飾器可以有多個,放在上面和下面是不同的,

from flask import Flask,render_template,request,redirect,session,url_forapp = Flask(__name__) app.debug=True app.secret_key='fangshao' USERS = {1:{'name':'張桂坤','age':18,'gender':'','text':"當眼淚掉下來的時候,是真的累了, 其實人生就是這樣: 你有你的煩,我有我的難,人人都有無聲的淚,人人都有難言的苦。 忘不了的昨天,忙不完的今天,想不到的明天,走不完的人生,過不完的坎坷,越不過的無奈,聽不完的謊言,看不透的人心放不下的牽掛,經歷不完的酸甜苦辣,這就是人生,這就是生活。"},2:{'name':'主城','age':28,'gender':'','text':"高中的時候有一個同學家里窮,每頓飯都是膜膜加點水,有時候吃點咸菜,我們六科老師每天下課都叫他去辦公室回答問題背誦課文,然后說太晚啦一起吃個飯,后來他考上了人大,拿到通知書的時候給每個老師磕了一個頭"},3:{'name':'服城','age':18,'gender':'','text':"高中的時候有一個同學家里窮,每頓飯都是膜膜加點水,有時候吃點咸菜,我們六科老師每天下課都叫他去辦公室回答問題背誦課文,然后說太晚啦一起吃個飯,后來他考上了人大,拿到通知書的時候給每個老師磕了一個頭"}, }def get_session(func):def inner(*args,**kwargs):user = session.get('user_info')if not user:return redirect('/login')return func(*args,**kwargs)return inner@app.route('/',endpoint='1111') @get_session def hello_world():return 'Hello World!'@app.route('/index',methods=['GET'],endpoint='n1') @get_session def index():# user=session.get('user_info')# print(user)# if user:return render_template('index.html',user_dict=USERS)# return redirect('/login')# @app.route('/index',methods=['GET']) # def index(): # user=session.get('user_info') # if user: # return render_template('index.html',user_dict=USERS) # url=url_for('111') # return redirect(url) @app.route('/detail/<int:nid>',methods=['GET'],endpoint='n2') def detail(nid):user=session.get('user_info')if not user:return redirect('/login')return render_template('detail.html',data=USERS[nid])@app.route('/login',methods=['GET','POST'],endpoint='111') def login():if request.method=='POST':user=request.form.get('user')pwd=request.form.get('pwd')if user=='fang' and pwd=='123':session['user_info']=userreturn redirect('/index')else:return render_template('login.html',msg='用戶名或密碼錯誤')return render_template('login.html')if __name__ == '__main__':app.run() View Code

 注意:這里加上裝飾器,會重名,給他設置一個別名endpoint=‘別名’

 functools.wraps(函數):# 幫助我們保存一些設置函數的元信息

from flask import Flask,render_template,request,redirect,session,url_forapp = Flask(__name__) app.debug=True app.secret_key='fangshao' USERS = {1:{'name':'張桂坤','age':18,'gender':'','text':"當眼淚掉下來的時候,是真的累了, 其實人生就是這樣: 你有你的煩,我有我的難,人人都有無聲的淚,人人都有難言的苦。 忘不了的昨天,忙不完的今天,想不到的明天,走不完的人生,過不完的坎坷,越不過的無奈,聽不完的謊言,看不透的人心放不下的牽掛,經歷不完的酸甜苦辣,這就是人生,這就是生活。"},2:{'name':'主城','age':28,'gender':'','text':"高中的時候有一個同學家里窮,每頓飯都是膜膜加點水,有時候吃點咸菜,我們六科老師每天下課都叫他去辦公室回答問題背誦課文,然后說太晚啦一起吃個飯,后來他考上了人大,拿到通知書的時候給每個老師磕了一個頭"},3:{'name':'服城','age':18,'gender':'','text':"高中的時候有一個同學家里窮,每頓飯都是膜膜加點水,有時候吃點咸菜,我們六科老師每天下課都叫他去辦公室回答問題背誦課文,然后說太晚啦一起吃個飯,后來他考上了人大,拿到通知書的時候給每個老師磕了一個頭"}, }import functools def get_session(func):@functools.wraps(func)def inner(*args,**kwargs):user = session.get('user_info')if not user:return redirect('/login')return func(*args,**kwargs)return inner@app.route('/',endpoint='1111') @get_session def hello_world():return 'Hello World!'@app.route('/index',methods=['GET']) @get_session def index():# user=session.get('user_info')# print(user)# if user:return render_template('index.html',user_dict=USERS)# return redirect('/login')# @app.route('/index',methods=['GET']) # def index(): # user=session.get('user_info') # if user: # return render_template('index.html',user_dict=USERS) # url=url_for('111') # return redirect(url) @app.route('/detail/<int:nid>',methods=['GET']) def detail(nid):user=session.get('user_info')if not user:return redirect('/login')return render_template('detail.html',data=USERS[nid])@app.route('/login',methods=['GET','POST']) def login():if request.method=='POST':user=request.form.get('user')pwd=request.form.get('pwd')if user=='fang' and pwd=='123':session['user_info']=userreturn redirect('/index')else:return render_template('login.html',msg='用戶名或密碼錯誤')return render_template('login.html')if __name__ == '__main__':app.run() View Code

 FBV的寫法:

  使用裝飾器,將括號里面的內容添加到路由中@app.route()

DEFAULT_CONVERTERS = {'default': UnicodeConverter,'string': UnicodeConverter,'any': AnyConverter,'path': PathConverter,'int': IntegerConverter,'float': FloatConverter,'uuid': UUIDConverter, } View Code

   methods=[]:里面寫的是請求的方法,支持什么方法都要寫上什么方法。

  ??? endpoint=別名:為當前的url反向生成一個url,也就是起一個別名

  ??? app.add_url_rule('/...'):添加路由的另一種方法

def auth(func):def inner(*args, **kwargs):print('before')result = func(*args, **kwargs)print('after')return resultreturn inner@app.route('/index.html',methods=['GET','POST'],endpoint='index')@authdef index():return 'Index'def index():return "Index"self.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])orapp.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])app.view_functions['index'] = index View Code

 CBV的寫法:

  MethodView:API的簡單的一種實現方式,class創建的視圖類就需要繼承它。

class IndexView(views.MethodView):methods=['GET']decorators=[auth,]def get(self):return 'Index.GET'def post(self):return 'Index.POST' View Code

  app.add_url_rule('/路徑',view_func='類名'.as_view(name=返回的那個函數)

app.add_url_rule('/index',view_func=IndexView.as_view(name='index'))

  對于CBV來說:雖然傳進去的是類名,但是最后返回的還是一個函數。

def auth(func):def inner(*args, **kwargs):print('before')result = func(*args, **kwargs)print('after')return resultreturn innerclass IndexView(views.View):methods = ['GET']decorators = [auth, ]def dispatch_request(self):print('Index')return 'Index!'app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name=endpoint class IndexView(views.MethodView):methods = ['GET']decorators = [auth, ]def get(self):return 'Index.GET'def post(self):return 'Index.POST'app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name=endpoint @app.route和app.add_url_rule參數:rule, URL規則view_func, 視圖函數名稱defaults=None, 默認值,當URL中無參數,函數需要參數時,使用defaults={'k':'v'}為函數提供參數endpoint=None, 名稱,用于反向生成URL,即: url_for('名稱')methods=None, 允許的請求方式,如:["GET","POST"]strict_slashes=None, 對URL最后的 / 符號是否嚴格要求,如:@app.route('/index',strict_slashes=False),訪問 http://www.xx.com/index/ 或 http://www.xx.com/index均可@app.route('/index',strict_slashes=True)僅訪問 http://www.xx.com/index redirect_to=None, 重定向到指定地址如:@app.route('/index/<int:nid>', redirect_to='/home/<nid>')或def func(adapter, nid):return "/home/888"@app.route('/index/<int:nid>', redirect_to=func)subdomain=None, 子域名訪問from flask import Flask, views, url_forapp = Flask(import_name=__name__)app.config['SERVER_NAME'] = 'wupeiqi.com:5000'@app.route("/", subdomain="admin")def static_index():"""Flask supports static subdomainsThis is available at static.your-domain.tld"""return "static.your-domain.tld"@app.route("/dynamic", subdomain="<username>")def username_index(username):"""Dynamic subdomains are also supportedTry going to user1.your-domain.tld/dynamic"""return username + ".your-domain.tld"if __name__ == '__main__':app.run() View Code

 default:傳入函數的參數。就是url后面的那個參數

 subdomain={}:創建子域名

 window設置域名:hosts而文件下面直接就可以設置了C:\Windows\System32\driver\etc\hosts

 mcs系統設置域名:/ect/hosts文件下面就可以設置域名了  

from flask import Flask, views, url_forfrom werkzeug.routing import BaseConverterapp = Flask(import_name=__name__)class RegexConverter(BaseConverter):"""自定義URL匹配正則表達式"""def __init__(self, map, regex):super(RegexConverter, self).__init__(map)self.regex = regexdef to_python(self, value):"""路由匹配時,匹配成功后傳遞給視圖函數中參數的值:param value: :return: """return int(value)def to_url(self, value):"""使用url_for反向生成URL時,傳遞的參數經過該方法處理,返回的值用于生成URL中的參數:param value: :return: """val = super(RegexConverter, self).to_url(value)return val# 添加到flask中app.url_map.converters['regex'] = RegexConverter@app.route('/index/<regex("\d+"):nid>')def index(nid):print(url_for('index', nid='888'))return 'Index'if __name__ == '__main__':app.run() View Code

五 模板

 1、模板的使用:Flask使用的是Jinja2模板,所以其語法和Django無差別

 2、自定義模板方法:Flask中自定義模板方法的方式和Bottle相似,創建一個函數并通過參數的形式傳入

 for循環,并取到索引

  {% for k,v in 對象.items()%}

    字典的取值方法:v.字段名? v['字段名']? v.get('字段名')

  {% endfor %}

 函數渲染:不僅要加上括號,還可以加上參數

  {{函數名(參數)}}? 加上|safe:防止xss攻擊

<!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title></title> </head> <body><h1>自定義函數</h1>{{ww()|safe}}</body> </html> View Code

  在后臺如果使用

from flask import Flask,render_template app = Flask(__name__)def wupeiqi():return '<h1>Wupeiqi</h1>'@app.route('/login', methods=['GET', 'POST']) def login():return render_template('login.html', ww=wupeiqi)app.run() View Code

 Markup:后臺設置xss攻擊

 宏定義:就是定義一塊html,定義的這一塊就是就是一個函數

  {% macre 函數名(參數)%}? {% endmacre %}

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body>{% macro input(name, type='text', value='') %}<input type="{{ type }}" name="{{ name }}" value="{{ value }}">{% endmacro %}{{ input('n1') }}{% include 'tp.html' %}<h1>asdf{{ v.k1}}</h1> </body> </html> View Code

六 請求和響應

 請求和響應都是從flask為念中導入的

 request:請求

 response:響應

  jsonify:響應的數據類型不是字符串類型,就是用這個將響應的內容轉成字符串。

from flask import Flaskfrom flask import requestfrom flask import render_templatefrom flask import redirectfrom flask import make_responseapp = Flask(__name__)@app.route('/login.html', methods=['GET', "POST"])def login():# 請求相關信息# request.method# request.args# request.form# request.values# request.cookies# request.headers# request.path# request.full_path# request.script_root# request.url# request.base_url# request.url_root# request.host_url# request.host# request.files# obj = request.files['the_file_name']# obj.save('/var/www/uploads/' + secure_filename(f.filename))# 響應相關信息# return "字符串"# return render_template('html模板路徑',**{})# return redirect('/index.html')# response = make_response(render_template('index.html'))# response是flask.wrappers.Response類型# response.delete_cookie('key')# response.set_cookie('key', 'value')# response.headers['X-Something'] = 'A value'# return responsereturn "內容"if __name__ == '__main__':app.run() View Code

七 Session和Cookie

 session在使用前必須要有app.sceret_key加密,就相當于加鹽

 session['名']=字段:設置session

 應用demo:實例,使用裝飾器寫一個用戶認證

  思路:裝飾器,一個函數可以加上多個裝飾器,反向查找的名稱不允許重名:endpoint

  session.pop:刪除一個session

 我們這里使用的session是flask內置的使用加密的cookie來保存數據的。

 基本使用:

from flask import Flask, session, redirect, url_for, escape, requestapp = Flask(__name__)@app.route('/') def index():if 'username' in session:return 'Logged in as %s' % escape(session['username'])return 'You are not logged in'@app.route('/login', methods=['GET', 'POST']) def login():if request.method == 'POST':session['username'] = request.form['username']return redirect(url_for('index'))return '''<form action="" method="post"><p><input type=text name=username><p><input type=submit value=Login></form>'''@app.route('/logout') def logout():# remove the username from the session if it's theresession.pop('username', None)return redirect(url_for('index'))# set the secret key. keep this really secret: app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'基本使用 View Code

 自定義session 

pip3 install Flask-Sessionrun.pyfrom flask import Flaskfrom flask import sessionfrom pro_flask.utils.session import MySessionInterfaceapp = Flask(__name__)app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'app.session_interface = MySessionInterface()@app.route('/login.html', methods=['GET', "POST"])def login():print(session)session['user1'] = 'alex'session['user2'] = 'alex'del session['user2']return "內容"if __name__ == '__main__':app.run()session.py#!/usr/bin/env python# -*- coding:utf-8 -*-import uuidimport jsonfrom flask.sessions import SessionInterfacefrom flask.sessions import SessionMixinfrom itsdangerous import Signer, BadSignature, want_bytesclass MySession(dict, SessionMixin):def __init__(self, initial=None, sid=None):self.sid = sidself.initial = initialsuper(MySession, self).__init__(initial or ())def __setitem__(self, key, value):super(MySession, self).__setitem__(key, value)def __getitem__(self, item):return super(MySession, self).__getitem__(item)def __delitem__(self, key):super(MySession, self).__delitem__(key)class MySessionInterface(SessionInterface):session_class = MySessioncontainer = {}def __init__(self):import redisself.redis = redis.Redis()def _generate_sid(self):return str(uuid.uuid4())def _get_signer(self, app):if not app.secret_key:return Nonereturn Signer(app.secret_key, salt='flask-session',key_derivation='hmac')def open_session(self, app, request):"""程序剛啟動時執行,需要返回一個session對象"""sid = request.cookies.get(app.session_cookie_name)if not sid:sid = self._generate_sid()return self.session_class(sid=sid)signer = self._get_signer(app)try:sid_as_bytes = signer.unsign(sid)sid = sid_as_bytes.decode()except BadSignature:sid = self._generate_sid()return self.session_class(sid=sid)# session保存在redis中# val = self.redis.get(sid)# session保存在內存中val = self.container.get(sid)if val is not None:try:data = json.loads(val)return self.session_class(data, sid=sid)except:return self.session_class(sid=sid)return self.session_class(sid=sid)def save_session(self, app, session, response):"""程序結束前執行,可以保存session中所有的值如:保存到resit寫入到用戶cookie"""domain = self.get_cookie_domain(app)path = self.get_cookie_path(app)httponly = self.get_cookie_httponly(app)secure = self.get_cookie_secure(app)expires = self.get_expiration_time(app, session)val = json.dumps(dict(session))# session保存在redis中# self.redis.setex(name=session.sid, value=val, time=app.permanent_session_lifetime)# session保存在內存中 self.container.setdefault(session.sid, val)session_id = self._get_signer(app).sign(want_bytes(session.sid))response.set_cookie(app.session_cookie_name, session_id,expires=expires, httponly=httponly,domain=domain, path=path, secure=secure)自定義Session View Code

 第三方session

from flask import Flask, session, redirect from flask.ext.session import Sessionapp = Flask(__name__) app.debug = True app.secret_key = 'asdfasdfasd'app.config['SESSION_TYPE'] = 'redis' from redis import Redis app.config['SESSION_REDIS'] = Redis(host='192.168.0.94',port='6379') Session(app)@app.route('/login') def login():session['username'] = 'alex'return redirect('/index')@app.route('/index') def index():name = session['username']return nameif __name__ == '__main__':app.run()第三方session View Code

八 閃現

 flash:向某一個地方設置一個值

  category:設置值的分類

 get_flashed_messages:從某一個地方獲取多個值,并且清除

  他們也是基于app.secret_key實現的

from flask import Flask,flash,get_flashed_messagesapp = Flask(__name__) app.secret_key = 'asdfasdf' @app.route('/get') def get():# 從某個地方獲取設置過的所有值,并清除。data = get_flashed_messages()print(data)return 'Hello World!'@app.route('/set') def set():# 向某個地方設置一個值flash('阿斯蒂芬')return 'Hello World!'if __name__ == '__main__':app.run() View Code

  category_filter:只取一類的值

from flask import Flask,flash,get_flashed_messages,request,redirectapp = Flask(__name__) app.secret_key = 'asdfasdf'@app.route('/index') def index():# 從某個地方獲取設置過的所有值,并清除。val = request.args.get('v')if val == 'oldboy':return 'Hello World!'flash('超時錯誤',category="x1")return "ssdsdsdfsd"# return redirect('/error') @app.route('/error') def error():"""展示錯誤信息:return:"""data = get_flashed_messages(category_filter=['x1'])if data:msg = data[0]else:msg = "..."return "錯誤信息:%s" %(msg,)if __name__ == '__main__':app.run() View Code

??? request.query_string.get('字段'):獲取到所有的url

 request.args.get('字段'):獲取get請求后面的值

 什么是閃現:設置不管多少次的值,是基于session實現的,只要一次取到全部的值,并且清除

 閃現的用法:應用于臨時數據的操作,比如:顯示錯誤信息等等

from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request app = Flask(__name__) app.secret_key ='sdfsdfsdf'@app.route('/users') def users():# 方式一# msg = request.args.get('msg','')# 方式二# msg = session.get('msg')# if msg:# del session['msg']# 方式三v = get_flashed_messages()print(v)msg = ''return render_template('users.html',msg=msg)@app.route('/useradd') def user_add():# 在數據庫中添加一條數據# 假設添加成功,在跳轉到列表頁面時,顯示添加成功# 方式一# return redirect('/users?msg=添加成功')# 方式二# session['msg'] = '添加成功'# 方式三flash('添加成功')return redirect('/users')if __name__ == '__main__':app.run(debug=True) View Code

九 藍圖(blueprint)

 什么是藍圖:功能分類,還可以定義自己的模板和路由分發。就是為了構造目錄的。

 藍圖的特性:不僅能將不同功能的app進行分來,并且還可以定義自己的模板路徑可以實現路由的分發。可以實現每一個程序構造自己的app。

 Blueprint:創建藍圖? ('藍圖名','__name__')

  url_prefix:為下面所有函數的使用機上一個前綴,可以為統一的某一類加上前綴

  template_folder:定義自己的模板路徑(html文件勒頸)

 app.register_blueprint:將藍圖注冊到app

 小型應用程序:示例

 大型應用程序:示例

小中型:

manage.py

import fcrm if __name__ == '__main__': fcrm.app.run()

__init__.py(只要一導入fcrm就會執行__init__.py文件)

from flask import Flask #導入accout 和order from fcrm.views import accout from fcrm.views import order app = Flask(__name__) print(app.root_path) #根目錄 app.register_blueprint(accout.accout) #吧藍圖注冊到app里面,accout.accout是創建的藍圖對象 app.register_blueprint(order.order)

accout.py

from flask import Blueprint,render_template accout = Blueprint("accout",__name__) @accout.route('/accout') def xx(): return "accout" @accout.route("/login") def login(): return render_template("login.html")

order.py

from flask import Blueprint order = Blueprint("order",__name__) @order.route('/order') def register(): #注意視圖函數的名字不能和藍圖對象的名字一樣 return "order

使用藍圖時需要注意的

大型:

?

十 請求的擴展

 類似于django的中間件

 @app.defore_request:定制請求函數,每次請求都會執行有這個裝飾器的函數,每次都是從上到下執行的

 request.url:拿到正要運行的url

 @app.after_request:定制響應的函數,每次響應執行這個裝飾器的函數,每次都是從下到上執行的

 請求哈響應可以有多個,如果請求給攔截了,但是所有的響應都會執行

 @app.errorhandler:定制錯誤的信息。

 @ app.template_global:為模板定制函數,也就是自定義模板

 @app.before_first_request:只有第一次請求來了才執行這個函數

from flask import Flask,render_template,request,redirect,session,url_for app = Flask(__name__) app.debug = True app.secret_key = 'siuljskdjfs'@app.before_request def process_request1(*args,**kwargs):print('process_request1 進來了')@app.before_request def process_request2(*args,**kwargs):print('process_request2 進來了')@app.after_request def process_response1(response):print('process_response1 走了')return response@app.after_request def process_response2(response):print('process_response2 走了')return response@app.errorhandler(404) def error_404(arg):return "404錯誤了"@app.before_first_request def first(*args,**kwargs):pass@app.route('/index',methods=['GET']) def index():print('index函數')return "Index"if __name__ == '__main__':app.run() View Code

 基于中間件實現用戶的認證登陸

@app.before_requestdef process_request(*args,**kwargs):if request.path == '/login':return Noneuser = session.get('user_info')if user:return Nonereturn redirect('/login') View Code

 模板中定制方法:

@app.template_global()def sb(a1, a2):return a1 + a2{{sb(1,2)}} @app.template_filter()def db(a1, a2, a3):return a1 + a2 + a3{{ 1|db(2,3)}} View Code

十一 中間件

 中間件:在這里就是一個請求的入口

 每次請求進來都會執行app的call方法。

from flask import Flaskapp = Flask(__name__)@app.route('/') def index():return 'Hello World!'class Md(object):def __init__(self,old_wsgi_app):self.old_wsgi_app = old_wsgi_appdef __call__(self, environ, start_response):print('開始之前')ret = self.old_wsgi_app(environ, start_response)print('結束之后')return retif __name__ == '__main__':app.wsgi_app = Md(app.wsgi_app)app.run() View Code

十二 上下文處理

 threading.local:為每一個線程開辟一個單獨的內存空間來保存他自己的值

import threading# class Foo(): # def __init__(self): # self.name=0 # # local_value=Foo() local_value=threading.local() def func(num):local_value.name=numimport timetime.sleep(1)print(local_value.name,threading.current_thread().name)for i in range(20):th=threading.Thread(target=func,args=(i,),name='線程%s'%i)th.start() View Code

 request:

  情況一:單線程和單進程的情況下不會有問題,應為自己使用為完畢過后,就會自動的清空request。

  情況二:單進程和多線程,threading.local對象

  情況三:但進程和單線程多個協程,theading.local對象就會出問題。

 解決方法:

  以后不支持協程:就可以使用內置的threading.local對象

  支持協程:自定義類似threading.local對象的功能支持協程

 _thread.get_ident:獲取線程的一個唯一標識

 greenlet.getcurrent:獲取協程額唯一標識

 自定義支持協程:

""" {1368:{} } """import threading try:from greenlet import getcurrent as get_ident # 協程 except ImportError:try:from thread import get_identexcept ImportError:from _thread import get_ident # 線程class Local():def __init__(self):self.storage={}self.get_ident=get_identdef set(self,k,v):ident=self.get_ident()origin=self.storage.get(ident)if not origin:origin={k:v}else:origin[k]=vself.storage[ident]=origindef get(self,k):ident=self.get_ident()origin=self.storage.get(ident)if not origin:return Nonereturn origin.get(k,None)local_values=Local()def task(num):local_values.set('name',num)import timetime.sleep(1)print(local_values.get('name'),threading.current_thread().name)for i in range(20):th=threading.Thread(target=task,args=(i,),name='線程%s'%i)th.start() View Code

 反射實例:

class Foo(object):def __init__(self):object.__setattr__(self,'storage',{})def __setattr__(self, key, value):self.storage={'k1:v1'}print(key,value)def __getattr__(self, item):print(item)return 'df'obj=Foo() # obj.x = 123print(obj) View Code

 自定義支持協程的flask:使用反射實現

""" {1368:{} } """ import flask.globals import threading try:from greenlet import getcurrent as get_ident # 協程 except ImportError:try:from thread import get_identexcept ImportError:from _thread import get_ident # 線程class Local():def __init__(self):object.__setattr__(self,'__storage__',{})object.__setattr__(self,'__ident_func__',get_ident)def __setattr__(self, name, value):ident=self.__ident_func__()storage=self.__storage__try:storage[ident][name]=valueexcept KeyError:storage[ident]={name:value}def __getattr__(self, name):try:return self.__storage__[self.__ident_func__()][name]except KeyError:raise AttributeError(name)def __delattr__(self, name):try:del self.__storage__[self.__ident_finc__()][name]except KeyError:raise AttributeError(name)local_values=Local()def task(num):local_values.name=numimport timetime.sleep(1)print(local_values.name,threading.current_thread().name) for i in range(20):th=threading.Thread(target=task,args=(i,),name='線程%s'%i)th.start() View Code

? 補充:
  偏函數:functools模塊

   functools.partial:創建一個新的函數,主要是為了給原函數傳入參數

# import functools # # def func(a1,a2): # print(a1+a2) # # # new_func=functools.partial(func,12) # # new_func(21) View Code

  面向對象的__add__方法補充:當把面向對象中的所有__函數__實現時,對象做任何操作時,都會執行其中對應的方法。

   __add__:誰在前面就會調用誰的__add__方法

# class Foo(): # def __init__(self,num): # self.num=num # def __add__(self,other): # return Foo(self.num+other.num) # obj1=Foo(11) # obj2=Foo(22) # v=obj1+obj2 # print(v) View Code

  拼接列表中的值:

   itertools.chain:傳入函數,產生一個新的函數對象的列表,主要幫助我們做列表元素的拼接

    實例1:

from itertools import chain# def a1(x): # return x+1 # # func_list=[a1,lambda x:x+1] # # def a2(y): # return y+10 # # func_list_1=chain([a2],func_list) # for func in func_list_1: # print(func) View Code

    實例2:

# v1=[1,2,3] # v2=[4,5,6] # # for l in chain(v1,v2): # chain 主要是做列表的拼接 # print(l) View Code

  上下文源碼流程:https://www.processon.com/diagraming/5ab8c9f0e4b0d165d5b83fbb

 談談flask的上下文管理:

- 與django相比是兩種不同的實現方式。- django/tornado是通過傳參數形式- flask是通過上下文管理兩種都可以實現,只不過試下方式不一樣。- 上下文管理:- threading.local/Local類,其中創建了一個字典{greelet做唯一標識:存數據} 保證數據隔離- 請求進來:- 請求相關所有數據封裝到了RequestContext中。- 再講RequestContext對象添加到Local中(通過LocalStack將對象添加到Local對象中)- 使用,調用request- 調用此類方法 request.method、print(request)、request+xxx 會執行LocalProxy中對應的方法- 函數- 通過LocalStack去Local中獲取值。- 請求終止- 通過LocalStack的pop方法 Local中將值異常。 View Code

 補充:

再將對象封裝到Local中Flask可以傳入任何的字符串參數 View Code

 請求上下文:請求上下文封裝的就是RequestContext對象

  request:是LocalProxy對象

   這個對象實例化事傳入了一個函數,還有一個request參數
   以后執行偏函數partail(_Lookup_req_object,'request')時,自動傳遞request參數
   目標:去Local中獲取ctx,然后再在ctx中獲取request
   ctx.push:里面做的事,將ctx通過LocalStack添加到Local中

  session:經過push之后,session里面已經有值了,seif.session幫助我獲取session信息

 應用上下文:應用上下文封裝的是AppContext

  AppContext里面封裝了app對象
  app.context:創建了app對象
  app.app_ctx_global_class:相當于一個全局變量

  app和g

  g:每個請求周期都會創建一個用于在請求周期中傳遞值的一個容器。只有一次生命周期可用,因為一次請求周期后第二次就會重新創建
print(g):執行g的實例對象

 請求到來 ,有人來訪問:

# 將請求相關的數據environ封裝到了RequestContext對象中# 再講對象封裝到local中(每個線程/每個協程獨立空間存儲)# ctx.app # 當前APP的名稱# ctx.request # Request對象(封裝請求相關東西)# ctx.session # 空_request_ctx_stack.local = {唯一標識:{"stack":[ctx, ]},唯一標識:{"stack":[ctx, ]},}# app_ctx = AppContext對象# app_ctx.app# app_ctx.g _app_ctx_stack.local = {唯一標識:{"stack":[app_ctx, ]},唯一標識:{"stack":[app_ctx, ]},} View Code

 使用:print打印request,session.g,current_app的時候,都會執行他們相對應的對象的__str__
他們之間不同的是偏函數不一樣

from flask import request,session,g,current_appprint(request,session,g,current_app)都會執行相應LocalProxy對象的 __str__current_app = LocalProxy(_find_app)request = LocalProxy(partial(_lookup_req_object, 'request'))session = LocalProxy(partial(_lookup_req_object, 'session'))current_app = LocalProxy(_find_app)g = LocalProxy(partial(_lookup_app_object, 'g')) View Code

 終止,全部pop

 問題:

  如果他是多線程的時候是如何實現的。

請求到來的時候就是兩個Local,但是沒有值,一共只有兩個Local,進來一個線程創建自己的唯一標識。不過進來多少的線程,都只用這兩個Local View Code

  flask的local中保存數據時,使用列表創建出來的棧。為什么用棧?

- 如果寫web程序,web運行環境;棧中永遠保存1條數據(可以不用棧)。- 寫腳本獲取app信息時,可能存在app上下文嵌套關系。from flask import Flask,current_app,globals,_app_ctx_stackapp1 = Flask('app01')app1.debug = False # 用戶/密碼/郵箱# app_ctx = AppContext(self):# app_ctx.app# app_ctx.g app2 = Flask('app02')app2.debug = True # 用戶/密碼/郵箱# app_ctx = AppContext(self):# app_ctx.app# app_ctx.g with app1.app_context():# __enter__方法 -> push -> app_ctx添加到_app_ctx_stack.local# {<greenlet.greenlet object at 0x00000000036E2340>: {'stack': [<flask.ctx.AppContext object at 0x00000000037CA438>]}}print(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG'])with app2.app_context():# {<greenlet.greenlet object at 0x00000000036E2340>: {'stack': [<flask.ctx.AppContext object at 0x00000000037CA438> ]}}print(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG'])print(current_app.config['DEBUG']) View Code

 多app應用:不僅可以使用藍圖進行分發,還可以使用app進行分發
  DispatchMiddleware:可以進行路由分發。
  在這里面沒有app.run,直接可以run_simple啟動

from werkzeug.wsgi import DispatcherMiddlewarefrom werkzeug.serving import run_simplefrom flask import Flask, current_appapp1 = Flask('app01')app2 = Flask('app02')@app1.route('/index')def index():return "app01"@app2.route('/index2')def index2():return "app2"# http://www.oldboyedu.com/index# http://www.oldboyedu.com/sec/index2dm = DispatcherMiddleware(app1, {'/sec': app2,})if __name__ == "__main__":run_simple('localhost', 5000, dm) View Code

 問題:web訪問多app,上線問管理是如何實現的

  請求進來,為棧添加的還是一個值

 問題:為什么使用棧,離線腳本

  如果寫web程序,或者web運行環境:棧中永遠保存一條數據(這個可以不使用棧)
  寫腳本獲取app信息的時候,可能會存在上下文嵌套關系。這時有可能要用到棧

 問題:問題:Web訪問多app應用時,上下文管理是如何實現?

 補充:

 遇到with就會執行__enter__方法,這個方法返回值,as后面那個值就是返回值
 當指執行完畢之后 ,自動調用類的__exit__方法 from flask import Flask,current_app,globals,_app_ctx_stackapp1 = Flask('app01') app1.debug = False # 用戶/密碼/郵箱 # app_ctx = AppContext(self): # app_ctx.app # app_ctx.g app2 = Flask('app02') app2.debug = True # 用戶/密碼/郵箱 # app_ctx = AppContext(self): # app_ctx.app # app_ctx.g with app1.app_context(): # # __enter__方法 -> push -> app_ctx添加到_app_ctx_stack.localprint(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG'])with app1.app_context():print(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG'])print(current_app.config['DEBUG'])with app1.app_context():print(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG']) with app1.app_context():print(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG']) View Code

 補充:永遠兩個Local對象

 實現細節:
  ResquestContext對象通過LocalStark添加到Local中
  導入的request是一個LocalProxy對象,然后在通過偏函數調用了LocakStack,在調用Local
  RequestContext的auto_pop,在執行LocalStack,再到Local中移除

十三 數據庫的連接池

 前夕:

  django的常用數據庫:

   ORM:django默認的數據庫

   pymysql模塊:導入mysql數據庫,python2和python3版本都有這個模塊

   MySQLdb:一樣,也是導入mysql數據庫,這個模塊只有python2版本才有

  flask/其他:

   pymysql:導mysql數據庫

   MySQLdb:導入mysql數據庫

  SQLAchemy:

   是ORM的一款框架,可以導入mysql數據庫(pymysql / MySQLdb)

 原生SQL:

from flask import Flaskapp = Flask(__name__)@app.route("/") def hello():import pymysqlCONN = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8')cursor = CONN.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()print(result)return "Hello World"if __name__ == '__main__':app.run() View Code from flask import Flaskapp = Flask(__name__) import pymysql CONN = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8')@app.route("/") def hello():cursor = CONN.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()print(result)return "Hello World"if __name__ == '__main__':app.run()######加鎖######################### from flask import Flask import threading app = Flask(__name__) import pymysql CONN = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8')@app.route("/") def hello():with threading.Lock():cursor = CONN.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()print(result)return "Hello World"if __name__ == '__main__':app.run() View Code

 問題:
 解決:

  不能為每一個用戶創建一個鏈接

  創建一定數量的連接池,只要連接池有空的,才會進來,不然就會等著。

 使用UBDtils模塊:

  下載網站:https://pypi.python.org/pypi/DBUtils

   pip install UBDtils

  如果安裝到虛擬環境下面,需要先切換到虛擬環境下面

  使用:

   模式一:

    為每一個線程創建一個鏈接,即使縣城調用close方法,也不會關閉掉

    占用連接池不放,浪費了連接池

import pymysql from DBUtils.PersistentDB import PersistentDBPOOL = PersistentDB(creator=pymysql, # 使用鏈接數據庫的模塊maxusage=None, # 一個鏈接最多被重復使用的次數,None表示無限制setsession=[], # 開始會話前執行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0, # ping MySQL服務端,檢查是否服務可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = alwayscloseable=False,# 如果為False時, conn.close() 實際上被忽略,供下次使用,再線程關閉時,才會自動關閉鏈接。如果為True時, conn.close()則關閉鏈接,那么再次調用pool.connection時就會報錯,因為已經真的關閉了連接(pool.steady_connection()可以獲取一個新的鏈接)threadlocal=None, # 本線程獨享值得對象,用于保存鏈接對象,如果鏈接對象被重置host='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8' )def func():conn = POOL.connection(shareable=False)cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()conn.close()func() View Code

   模式二:
    設置最大限制創建連接池的數量,進來一個線程,就創建一個連接池

    如果超過連接池的限制數量,就會在那里等著有空的連接池釋放出來才能夠下一個線程鏈接進去

import time import pymysql import threading from DBUtils.PooledDB import PooledDB, SharedDBConnection POOL = PooledDB(creator=pymysql, # 使用鏈接數據庫的模塊maxconnections=6, # 連接池允許的最大連接數,0和None表示不限制連接數mincached=2, # 初始化時,鏈接池中至少創建的空閑的鏈接,0表示不創建maxcached=5, # 鏈接池中最多閑置的鏈接,0和None不限制maxshared=3, # 鏈接池中最多共享的鏈接數量,0和None表示全部共享。PS: 無用,因為pymysql和MySQLdb等模塊的 threadsafety都為1,所有值無論設置為多少,_maxcached永遠為0,所以永遠是所有鏈接都共享。blocking=True, # 連接池中如果沒有可用連接后,是否阻塞等待。True,等待;False,不等待然后報錯maxusage=None, # 一個鏈接最多被重復使用的次數,None表示無限制setsession=[], # 開始會話前執行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,# ping MySQL服務端,檢查是否服務可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = alwayshost='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8' )def func():# 檢測當前正在運行連接數的是否小于最大鏈接數,如果不小于則:等待或報raise TooManyConnections異常# 否則# 則優先去初始化時創建的鏈接中獲取鏈接 SteadyDBConnection。# 然后將SteadyDBConnection對象封裝到PooledDedicatedDBConnection中并返回。# 如果最開始創建的鏈接沒有鏈接,則去創建一個SteadyDBConnection對象,再封裝到PooledDedicatedDBConnection中并返回。# 一旦關閉鏈接后,連接就返回到連接池讓后續線程繼續使用。conn = POOL.connection()# print(th, '鏈接被拿走了', conn1._con)# print(th, '池子里目前有', pool._idle_cache, '\r\n') cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()conn.close()func() View Code

  工作實用:

import pymysqlfrom DBUtils.PooledDB import PooledDBPOOL = PooledDB(creator=pymysql, # 使用鏈接數據庫的模塊maxconnections=6, # 連接池允許的最大連接數,0和None表示不限制連接數mincached=2, # 初始化時,鏈接池中至少創建的空閑的鏈接,0表示不創建maxcached=5, # 鏈接池中最多閑置的鏈接,0和None不限制maxshared=3, # 鏈接池中最多共享的鏈接數量,0和None表示全部共享。PS: 無用,因為pymysql和MySQLdb等模塊的 threadsafety都為1,所有值無論設置為多少,_maxcached永遠為0,所以永遠是所有鏈接都共享。blocking=True, # 連接池中如果沒有可用連接后,是否阻塞等待。True,等待;False,不等待然后報錯maxusage=None, # 一個鏈接最多被重復使用的次數,None表示無限制setsession=[], # 開始會話前執行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,# ping MySQL服務端,檢查是否服務可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = alwayshost='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8')"""class SQLHelper(object):@staticmethoddef fetch_one(sql,args):conn = POOL.connection()cursor = conn.cursor()cursor.execute(sql, args)result = cursor.fetchone()conn.close()return result@staticmethoddef fetch_all(self,sql,args):conn = POOL.connection()cursor = conn.cursor()cursor.execute(sql, args)result = cursor.fetchone()conn.close()return result# 以后使用:result = SQLHelper.fetch_one('select * from xxx',[])print(result)""" View Code

?十四 信號

 什么是信號:signal 一種處理異步時間的方法。信號是POSIX系統的信號,由硬件或軟件觸發,再有操作系統內核發給應用程序的中斷形式。POSIX由一系列的信號集。

 什么是信號量:semaphore 一種進程同步的機制。信號量是POSIX進程間通信的工具,在它上面定義了一系列操作原語,簡單地講它可以在進程間進行通信。

 flask自己沒有信號,要依賴blinker這個模塊 安裝 pip install blinker
 內置信號:

request_started = _signals.signal('request-started') # 請求到來前執行 request_finished = _signals.signal('request-finished') # 請求結束后執行 before_render_template = _signals.signal('before-render-template') # 模板渲染前執行 template_rendered = _signals.signal('template-rendered') # 模板渲染后執行 got_request_exception = _signals.signal('got-request-exception') # 請求執行出現異常時執行 request_tearing_down = _signals.signal('request-tearing-down') # 請求執行完畢后自動執行(無論成功與否) appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 請求上下文執行完畢后自動執行(無論成功與否) appcontext_pushed = _signals.signal('appcontext-pushed') # 請求上下文push時執行 appcontext_popped = _signals.signal('appcontext-popped') # 請求上下文pop時執行 message_flashed = _signals.signal('message-flashed') # 調用flask在其中添加數據時,自動觸發 View Code

 信號放哪里了:放在了signals文件里面
 signals.request_started.conncet(函數名) :注冊函數
 等待請求的到來
 在視圖函數執行之前觸法信號的
 是怎么觸發信號的?
  signals.request_started.send:方法觸發信號
  send是在full_dispatch_request方法中執行的

 信號的源碼流程:

 a. before_first_requestb. 觸發 request_started 信號c. before_requestd. 模板渲染渲染前的信號 before_render_template.send(app, template=template, context=context)rv = template.render(context) # 模板渲染渲染后的信號 template_rendered.send(app, template=template, context=context)e. after_requestf. session.save_session()g. 觸發 request_finished信號如果上述過程出錯:觸發錯誤處理信號 got_request_exception.send(self, exception=e)h. 觸發信號 request_tearing_down由信號引發的源碼流程:找擴展點 View Code

?十五 flask-session插件

 Flask中的session處理機制(內置:將session保存在加密cookie中實現)

 內置的session:

  請求剛到來:獲取隨機字符串,存在則去“數據庫”中獲取原來的個人數據,否則創建一個空容器。 --> 內存:對象(隨機字符串,{放置數據的容器})

# 1. obj = 創建SecureCookieSessionInterface() # 2. obj = open_session(self.request) = SecureCookieSession() # self.session = SecureCookieSession()對象。 self.session = self.app.open_session(self.request) View Code

  視圖:操作內存中 對象(隨機字符串,{放置數據的容器})
  ?響應:內存對象(隨機字符串,{放置數據的容器})
  將數據保存到“數據庫”
  把隨機字符串寫在用戶cookie中。

 自定義:

  請求剛到來:

# 創建特殊字典,并添加到Local中。 # 調用關系: # self.session_interface.open_session(self, request) # 由于默認app中的session_interface=SecureCookieSessionInterface() # SecureCookieSessionInterface().open_session(self, request) # 由于默認app中的session_interface=MySessionInterFace() # MySessionInterFace().open_session(self, request) self.session = self.app.open_session(self.request) View Code

  調用:

from flask import Flask,sessionapp = Flask(__name__) app.secret_key = 'suijksdfsd'import json class MySessionInterFace(object):def open_session(self,app,request):return {}def save_session(self, app, session, response):response.set_cookie('session_idfsdfsdfsdf',json.dumps(session))def is_null_session(self, obj):"""Checks if a given object is a null session. Null sessions arenot asked to be saved.This checks if the object is an instance of :attr:`null_session_class`by default."""return Falseapp.session_interface = MySessionInterFace()@app.route('/') def index():# 特殊空字典# 在local的ctx中找到session# 在空字典中寫值# 在空字典中獲取值session['xxx'] = 123return 'Index'# # 一旦請求到來 # app.__call__ # app.wsgi_app # app.session_interface # app.open_sessionif __name__ == '__main__':app.run() View Code

session -> LocalProxy -> 偏函數 -> LocalStack -> Local
  請求終止:

# 由于默認app中的session_interface=SecureCookieSessionInterface() # SecureCookieSessionInterface().save_session(self, app, session, response) # 由于默認app中的session_interface=MySessionInterFace() # MySessionInterFace().save_session(self, app, session, response) View Code

 flask-session組件
  使用:

from flask import Flask,session from flask_session import RedisSessionInterfaceapp = Flask(__name__) app.secret_key = 'suijksdfsd' View Code

   方式一

from redis import Redis conn = Redis() app.session_interface = RedisSessionInterface(conn,key_prefix='__',use_signer=False) View Code

   方式二

from redis import Redis from flask.ext.session import Session app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = Redis(host='192.168.0.94',port='6379') Session(app) View Code @app.route('/') def index(): session['xxx'] = 123 return 'Index'if __name__ == '__main__':app.run() View Code

  源碼:
?   ? 流程
 問題:設置cookie時,如何設定關閉瀏覽器則cookie失效。
  response.set_cookie('k','v',exipre=None)

十六 wtforms組建

 安裝:pip3 install wtforms

 使用:

from flask import Flask, render_template, request, redirect from wtforms import Form from wtforms.fields import core from wtforms.fields import html5 from wtforms.fields import simple from wtforms import validators from wtforms import widgetsapp = Flask(__name__, template_folder='templates') app.debug = Trueclass RegisterForm(Form):name = simple.StringField(label='用戶名',validators=[validators.DataRequired()],widget=widgets.TextInput(),render_kw={'class': 'form-control'},default='alex')pwd = simple.PasswordField(label='密碼',validators=[validators.DataRequired(message='密碼不能為空.')],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'})pwd_confirm = simple.PasswordField(label='重復密碼',validators=[validators.DataRequired(message='重復密碼不能為空.'),validators.EqualTo('pwd', message="兩次密碼輸入不一致")],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'})email = html5.EmailField(label='郵箱',validators=[validators.DataRequired(message='郵箱不能為空.'),validators.Email(message='郵箱格式錯誤')],widget=widgets.TextInput(input_type='email'),render_kw={'class': 'form-control'})gender = core.RadioField(label='性別',choices=((1, ''),(2, ''),),coerce=int # “1” “2” )city = core.SelectField(label='城市',choices=(('bj', '北京'),('sh', '上海'),))hobby = core.SelectMultipleField(label='愛好',choices=((1, '籃球'),(2, '足球'),),coerce=int)favor = core.SelectMultipleField(label='喜好',choices=((1, '籃球'),(2, '足球'),),widget=widgets.ListWidget(prefix_label=False),option_widget=widgets.CheckboxInput(),coerce=int,default=[1, 2])def __init__(self, *args, **kwargs):super(RegisterForm, self).__init__(*args, **kwargs)self.favor.choices = ((1, '籃球'), (2, '足球'), (3, '羽毛球'))def validate_pwd_confirm(self, field):"""自定義pwd_confirm字段規則,例:與pwd字段是否一致:param field::return:"""# 最開始初始化時,self.data中已經有所有的值if field.data != self.data['pwd']:# raise validators.ValidationError("密碼不一致") # 繼續后續驗證raise validators.StopValidation("密碼不一致") # 不再繼續后續驗證 @app.route('/register', methods=['GET', 'POST']) def register():if request.method == 'GET':form = RegisterForm(data={'gender': 2,'hobby':[1,]}) # initialreturn render_template('register.html', form=form)else:form = RegisterForm(formdata=request.form)if form.validate():print('用戶提交數據通過格式驗證,提交的值為:', form.data)else:print(form.errors)return render_template('register.html', form=form)if __name__ == '__main__':app.run() View Code

 源碼流程:

  實現方式:

1. 自動生成HTMLclass LoginForm(Form):# 字段(內部包含正則表達式)name = simple.StringField(label='用戶名',validators=[validators.DataRequired(message='用戶名不能為空.'),validators.Length(min=6, max=18, message='用戶名長度必須大于%(min)d且小于%(max)d')],widget=widgets.TextInput(), # 頁面上顯示的插件render_kw={'class': 'form-control'})# 字段(內部包含正則表達式)pwd = simple.PasswordField(label='密碼',validators=[validators.DataRequired(message='密碼不能為空.'),validators.Length(min=8, message='用戶名長度必須大于%(min)d'),validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",message='密碼至少8個字符,至少1個大寫字母,1個小寫字母,1個數字和1個特殊字符')],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'})def __iter__(self):return iter([self.name,self.pwd])# 方式一:obj = LoginForm()print(obj.name) # 調用字段的__str__# 方式二:obj = LoginForm()for item in obj:print(item) # 調用字段的__str__ View Code

  校驗:

a. 后臺定義好正則 b. 用戶發來數據 c. 對數據進行校驗 View Code

  源碼實現:自動生成HTML文件
?  ? 解釋:metaclass

  Metaclass作用:用來指定當前類是誰來創建的,如果不指定默認是type創建的
  類繼承:只要這個指定了Metaclass,那么這個類以及他的子類都指定同一個metaclass - MetaClass作用:用來指定當前類由誰來創建(默認type創建)。- 使用metaclassclass Foo(metaclass=type):pass class Foo(object):__metaclass__ = type- 類繼承class MyType(type):def __init__(self,*args,**kwargs):print('init')super(MyType,self).__init__(*args,**kwargs)def __call__(self, *args, **kwargs):print('call本質:調用類的__new__,再調用類的__init__')return super(MyType,self).__call__( *args, **kwargs)class Foo(metaclass=MyType):passclass Bar(Foo):passobj = Bar()- 問題:1. 什么意思?# 類由type來創建class Foo(metaclass=type)# 繼承Typeclass Foo(type)2. Flask多線程:服務端開多線程 View Code

   其他方式使用:

class MyType(type):def __init__(self,*args,**kwargs):print('init')super(MyType,self).__init__(*args,**kwargs)def __call__(self, *args, **kwargs):print('call')return super(MyType,self).__call__(*args,**kwargs)# Base=MyType('Base',(object,),{}) 是有MyType創建; metaclass=MyType # # class Foo(Base): # pass # # Foo() # 1. type可以創建類metaclass=type;MyType也可以創建類metaclass=MyType # 2. Base = MyType('Base', (object,), {}) --> # class Base(metaclass=MyType): # pass # class Foo(Base): # passclass Foo(MyType("Base",(object,),{})):# 第一個是類名,第二個就是他的父類,第三個就是屬性passFoo() View Code class MyType(type):def __init__(self,*args,**kwargs):print('init')super(MyType,self).__init__(*args,**kwargs)def __call__(self, *args, **kwargs):print('call')return super(MyType,self).__call__(*args,**kwargs)def with_metaclass(obj):return MyType('XX',(obj,),{})class Foo(with_metaclass(object)):passFoo() View Code """ 1. 什么意思?# 類由type來創建 class Foo(metaclass=type) # 繼承Type class Foo(type)"""class Foo(object):pass obj = Foo() # 對象是由類創建# 一切皆對象,類由type創建 class Foo(object):passFoo = type('Foo',(object,),{})# 一切皆對象,類由MyType創建 class MyType(type):pass Foo = MyType('Foo',(object,),{})class Foo(object,metaclass=MyType):pass# 一切皆對象,類由MyType創建 class MyType(type):def __init__(self, *args, **kwargs):print('init')super(MyType, self).__init__(*args, **kwargs)def __call__(cls, *args, **kwargs):print('call')return super(MyType, cls).__call__(*args, **kwargs)Foo = MyType('Foo',(object,),{})class Foo(object,metaclass=MyType):passFoo() View Code

  實例:form = LoginForm()

#!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, render_template, request, redirect from wtforms import Form from wtforms.fields import simple from wtforms import validators from wtforms import widgetsapp = Flask(__name__, template_folder='templates')app.debug = Trueclass MyForm(Form):'''創建字段,內部包含正則表達式'''name=simple.StringField(label='用戶名',validators=[validators.DataRequired(message='用戶名不能為空'),validators.Length(min=6,max=18,message='用戶名的長度不能小于%(min)d不能大于%(max)d')],widget=widgets.TextInput(),render_kw={'class': 'form-control'})password=simple.PasswordField(label='密碼',validators=[validators.DataRequired(message='密碼不能為空'),validators.Length(max=18,message='用戶名不能大于%(max)'),validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",message='密碼至少8個字符,至少1個大寫字母,1個小寫字母,1個數字和1個特殊字符')],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'})@app.route('/login', methods=['GET', 'POST']) def login():if request.method=='GET':form=MyForm()return render_template('login.html',form=form)else:form = MyForm(formdata=request.form)if form.validate():print('用戶提交數據通過格式驗證,提交的值為:', form.data)else:return render_template('login.html', form=form) if __name__ == '__main__':app.run() View Code

  驗證:form.validate()

import time import threading import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.engine.base import Engine View Code

 補充:

  為什么要在類里面定義方法:主要是為對象的數據進行二次加工

  類的對象不能直接被for循環,若想被循環,在類里面加上__iter__方法

十七 SQLAlchmey ORM框架

 目標:類/對象操作 -> SQL -> pymysql、MySQLdb -> 再在數據庫中執行。

 基本使用:這個不常見,

class MyForm(Form):'''創建字段,內部包含正則表達式'''name=simple.StringField(label='用戶名',validators=[validators.DataRequired(message='用戶名不能為空'),validators.Length(min=6,max=18,message='用戶名的長度不能小于%(min)d不能大于%(max)d')],widget=widgets.TextInput(),render_kw={'class': 'form-control'})password=simple.PasswordField(label='密碼',validators=[validators.DataRequired(message='密碼不能為空'),validators.Length(max=18,message='用戶名不能大于%(max)'),validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",message='密碼至少8個字符,至少1個大寫字母,1個小寫字母,1個數字和1個特殊字符')],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'}) View Code

  方式一:

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1?charset=utf8",max_overflow=2, # 超過連接池大小外最多創建的連接pool_size=5, # 連接池大小pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1 # 多久之后對線程池中的線程進行一次連接的回收(重置) )conn = engine.raw_connection()cursor = conn.cursor()cursor.execute("select * from t1")result = cursor.fetchall()cursor.close()conn.close() View Code

  方式二:

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1?charset=utf8",max_overflow=0, # 超過連接池大小外最多創建的連接pool_size=5, # 連接池大小pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1 # 多久之后對線程池中的線程進行一次連接的回收(重置) )def task(arg):conn = engine.raw_connection()cursor = conn.cursor()cursor.execute(#"select * from t1""select sleep(2)")result = cursor.fetchall()cursor.close()conn.close()for i in range(20):t = threading.Thread(target=task, args=(i,))t.start() View Code

 ORM:

models.py #!/usr/bin/env python# -*- coding:utf-8 -*-import datetimefrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, IndexBase = declarative_base()class Users(Base):__tablename__ = 'users' # 數據庫表名稱id = Column(Integer, primary_key=True) # id 主鍵name = Column(String(32), index=True, nullable=False) # name列,def init_db():"""根據類創建數據庫表:return: """engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",max_overflow=0, # 超過連接池大小外最多創建的連接pool_size=5, # 連接池大小pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1 # 多久之后對線程池中的線程進行一次連接的回收(重置) )Base.metadata.create_all(engine)def drop_db():"""根據類刪除數據庫表:return: """engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",max_overflow=0, # 超過連接池大小外最多創建的連接pool_size=5, # 連接池大小pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1 # 多久之后對線程池中的線程進行一次連接的回收(重置) )Base.metadata.drop_all(engine)if __name__ == '__main__':#drop_db()#init_db() app.py #!/usr/bin/env python# -*- coding:utf-8 -*-from sqlalchemy.orm import sessionmakerfrom sqlalchemy import create_enginefrom models import Usersengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5)Connection = sessionmaker(bind=engine)# 每次執行數據庫操作時,都需要創建一個Connectioncon = Connection()# ############# 執行ORM操作 #############obj1 = Users(name="alex1")con.add(obj1)# 提交事務 con.commit()# 關閉session con.close() View Code

? 詳細信息:

  創建表:

import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, IndexBase = declarative_base()class Users(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(32), index=True, nullable=False)email = Column(String(32), unique=True)ctime = Column(DateTime, default=datetime.datetime.now) # 3期師兄extra = Column(Text, nullable=True)__table_args__ = (# UniqueConstraint('id', 'name', name='uix_id_name'),# Index('ix_id_name', 'name', 'email'), )class Hobby(Base):__tablename__ = 'hobby'id = Column(Integer, primary_key=True)caption = Column(String(50), default='籃球')class Person(Base):__tablename__ = 'person'nid = Column(Integer, primary_key=True)name = Column(String(32), index=True, nullable=True)hobby_id = Column(Integer, ForeignKey("hobby.id"))class b2g(Base):__tablename__ = 'b2g'id = Column(Integer, primary_key=True, autoincrement=True)girl_id = Column(Integer, ForeignKey('girl.id'))boy_id = Column(Integer, ForeignKey('boy.id'))class Girl(Base):__tablename__ = 'girl'id = Column(Integer, primary_key=True)name = Column(String(64), unique=True, nullable=False)class Boy(Base):__tablename__ = 'boy'id = Column(Integer, primary_key=True, autoincrement=True)hostname = Column(String(64), unique=True, nullable=False)engine = create_engine("mysql+pymysql://root:0410@127.0.0.1:3306/sqlachemy?charset=utf8",max_overflow=0, # 超過連接池大小外最多創建的連接pool_size=5, # 連接池大小pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1 # 多久之后對線程池中的線程進行一次連接的回收(重置) )Base.metadata.create_all(engine) # Base.metadata.drop_all(engine) View Code

  對于表的增刪改查:

#!/usr/bin/env python # -*- coding:utf-8 -*- import time import threadingfrom sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine from sqlalchemy.sql import textfrom db import Users, Hostsengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine)session = Session()# ################ 添加 ################ """ obj1 = Users(name="wupeiqi") session.add(obj1)session.add_all([Users(name="wupeiqi"),Users(name="alex"),Hosts(name="c1.com"), ]) session.commit() """# ################ 刪除 ################ """ session.query(Users).filter(Users.id > 2).delete() session.commit() """ # ################ 修改 ################ """ session.query(Users).filter(Users.id > 0).update({"name" : "099"}) session.query(Users).filter(Users.id > 0).update({Users.name: Users.name + "099"}, synchronize_session=False) session.query(Users).filter(Users.id > 0).update({"age": Users.age + 1}, synchronize_session="evaluate") session.commit() """ # ################ 查詢 ################ """ r1 = session.query(Users).all() r2 = session.query(Users.name.label('xx'), Users.age).all() r3 = session.query(Users).filter(Users.name == "alex").all() r4 = session.query(Users).filter_by(name='alex').all() r5 = session.query(Users).filter_by(name='alex').first() r6 = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name='fred').order_by(Users.id).all() r7 = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all() """session.close() View Code

  查看的其他操作:

# 條件 ret = session.query(Users).filter_by(name='alex').all() ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all() ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all() ret = session.query(Users).filter(Users.id.in_([1,3,4])).all() ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all() ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all() from sqlalchemy import and_, or_ ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all() ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all() ret = session.query(Users).filter(or_(Users.id < 2,and_(Users.name == 'eric', Users.id > 3),Users.extra != "")).all()# 通配符 ret = session.query(Users).filter(Users.name.like('e%')).all() ret = session.query(Users).filter(~Users.name.like('e%')).all()# 限制 ret = session.query(Users)[1:2]# 排序 ret = session.query(Users).order_by(Users.name.desc()).all() ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()# 分組 from sqlalchemy.sql import funcret = session.query(Users).group_by(Users.extra).all() ret = session.query(func.max(Users.id),func.sum(Users.id),func.min(Users.id)).group_by(Users.name).all()ret = session.query(func.max(Users.id),func.sum(Users.id),func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()# 連表 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()ret = session.query(Person).join(Favor).all()ret = session.query(Person).join(Favor, isouter=True).all()# 組合 q1 = session.query(Users.name).filter(Users.id > 2) q2 = session.query(Favor.caption).filter(Favor.nid < 2) ret = q1.union(q2).all()q1 = session.query(Users.name).filter(Users.id > 2) q2 = session.query(Favor.caption).filter(Favor.nid < 2) ret = q1.union_all(q2).all() View Code

  原生的sql語句:

#!/usr/bin/env python # -*- coding:utf-8 -*- import time import threadingfrom sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine from sqlalchemy.sql import text from sqlalchemy.engine.result import ResultProxy from db import Users, Hostsengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine)session = Session()# 查詢 # cursor = session.execute('select * from users') # result = cursor.fetchall()# 添加 cursor = session.execute('insert into users(name) values(:value)',params={"value":'wupeiqi'}) session.commit() print(cursor.lastrowid)session.close() View Code

  多表操作:

一對多: #!/usr/bin/env python # -*- coding:utf-8 -*- import time import threadingfrom sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine from sqlalchemy.sql import text from sqlalchemy.engine.result import ResultProxy from db import Users, Hosts, Hobby, Personengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine) session = Session() # 添加 """ session.add_all([Hobby(caption='乒乓球'),Hobby(caption='羽毛球'),Person(name='張三', hobby_id=3),Person(name='李四', hobby_id=4), ])person = Person(name='張九', hobby=Hobby(caption='姑娘')) session.add(person)hb = Hobby(caption='人妖') hb.pers = [Person(name='文飛'), Person(name='博雅')] session.add(hb)session.commit() """# 使用relationship正向查詢 """ v = session.query(Person).first() print(v.name) print(v.hobby.caption) """# 使用relationship反向查詢 """ v = session.query(Hobby).first() print(v.caption) print(v.pers) """session.close()多對多: #!/usr/bin/env python # -*- coding:utf-8 -*- import time import threadingfrom sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine from sqlalchemy.sql import text from sqlalchemy.engine.result import ResultProxy from db import Users, Hosts, Hobby, Person, Group, Server, Server2Groupengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine) session = Session() # 添加 """ session.add_all([Server(hostname='c1.com'),Server(hostname='c2.com'),Group(name='A組'),Group(name='B組'), ]) session.commit()s2g = Server2Group(server_id=1, group_id=1) session.add(s2g) session.commit()gp = Group(name='C組') gp.servers = [Server(hostname='c3.com'),Server(hostname='c4.com')] session.add(gp) session.commit()ser = Server(hostname='c6.com') ser.groups = [Group(name='F組'),Group(name='G組')] session.add(ser) session.commit() """# 使用relationship正向查詢 """ v = session.query(Group).first() print(v.name) print(v.servers) """# 使用relationship反向查詢 """ v = session.query(Server).first() print(v.hostname) print(v.groups) """session.close() View Code

  其他操作:

#!/usr/bin/env python # -*- coding:utf-8 -*- import time import threadingfrom sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine from sqlalchemy.sql import text, func from sqlalchemy.engine.result import ResultProxy from db import Users, Hosts, Hobby, Person, Group, Server, Server2Groupengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine) session = Session()# 關聯子查詢 subqry = session.query(func.count(Server.id).label("sid")).filter(Server.id == Group.id).correlate(Group).as_scalar() result = session.query(Group.name, subqry) """ SELECT `group`.name AS group_name, (SELECT count(server.id) AS sid FROM server WHERE server.id = `group`.id) AS anon_1 FROM `group` """# 原生SQL """ # 查詢 cursor = session.execute('select * from users') result = cursor.fetchall()# 添加 cursor = session.execute('insert into users(name) values(:value)',params={"value":'wupeiqi'}) session.commit() print(cursor.lastrowid) """session.close()其他 View Code

  基于scoped_session實現線程安全:

#!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session from models import Usersengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine)""" # 線程安全,基于本地線程實現每個線程用同一個session # 特殊的:scoped_session中有原來方法的Session中的一下方法:public_methods = ('__contains__', '__iter__', 'add', 'add_all', 'begin', 'begin_nested','close', 'commit', 'connection', 'delete', 'execute', 'expire','expire_all', 'expunge', 'expunge_all', 'flush', 'get_bind','is_modified', 'bulk_save_objects', 'bulk_insert_mappings','bulk_update_mappings','merge', 'query', 'refresh', 'rollback','scalar' ) """ session = scoped_session(Session)# ############# 執行ORM操作 ############# obj1 = Users(name="alex1") session.add(obj1)# 提交事務 session.commit() # 關閉session session.close() View Code

  多線程執行實例:

#!/usr/bin/env python # -*- coding:utf-8 -*- import time import threadingfrom sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine from db import Usersengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine)def task(arg):session = Session()obj1 = Users(name="alex1")session.add(obj1)session.commit()for i in range(10):t = threading.Thread(target=task, args=(i,))t.start()多線程執行示例 View Code

 flask_sqlalchemy:Flask-SQLAlchemy(文件和目錄的管理)

Flask和SQLAlchemy的管理 - db = SQLAlchemy()- 包含配置- 包含ORM基類- 包含create_all- engine- 創建連接# 目錄結構保存好 View Code

 flask_sqlalchemy實例:https://pan.baidu.com/s/1IL68-68tBDluDtqsB1NS1g

 補充:

3. pipreqspip3 install pipreqspipreqs ./ View Code

?十八 flask_script和flask_migrate

 flask_script:功能相當于django中的manage文件,用于啟動flask項目使用的,python manage.py runserver

 flask_migrate:相當于django中的數據庫遷移,makemigrations/migrate -> migrate/upgrade

  批量導入:xlrd/xlwt

#!/usr/bin/env python # -*- coding:utf-8 -*- """ 生成依賴文件:pipreqs ./""" from sansa import create_app,db from flask_script import Manager from flask_migrate import Migrate,MigrateCommandapp = create_app() manager = Manager(app) migrate = Migrate(app, db)""" # 數據庫遷移命名python manage.py db initpython manage.py db migratepython manage.py db upgrade """ manager.add_command('db', MigrateCommand)@manager.command def custom(arg):"""自定義命令python manage.py custom 123:param arg::return:"""print(arg)@manager.option('-n', '--name', dest='name') @manager.option('-u', '--url', dest='url') def cmd(name, url):"""自定義命令執行: python manage.py cmd -n wupeiqi -u http://www.oldboyedu.com:param name::param url::return:"""print(name, url)if __name__ == '__main__':manager.run()""" 1. 運行程序時:python manage.py runserver """ View Code

?補充:  

 flask和django的其他導入靜態文件

  

?

轉載于:https://www.cnblogs.com/fangjie0410/p/8608536.html

總結

以上是生活随笔為你收集整理的flask框架基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美人与禽猛交狂配 | 奇米影视7777久久精品 | 在线 国产 欧美 亚洲 天堂 | 无码免费一区二区三区 | 人妻尝试又大又粗久久 | 久久精品国产精品国产精品污 | 在线播放免费人成毛片乱码 | 国产精品.xx视频.xxtv | 亚洲精品久久久久中文第一幕 | 国产综合色产在线精品 | 国产手机在线αⅴ片无码观看 | 激情内射亚州一区二区三区爱妻 | 精品久久综合1区2区3区激情 | 国产成人精品视频ⅴa片软件竹菊 | 国产精品久久福利网站 | 久久综合久久自在自线精品自 | 在线观看免费人成视频 | 精品少妇爆乳无码av无码专区 | 久久精品人人做人人综合试看 | 老子影院午夜伦不卡 | 最新国产麻豆aⅴ精品无码 | 成 人 网 站国产免费观看 | 无码av岛国片在线播放 | 亚洲欧美色中文字幕在线 | 四虎永久在线精品免费网址 | 波多野结衣一区二区三区av免费 | 亚洲一区二区三区四区 | 四虎影视成人永久免费观看视频 | 国产国语老龄妇女a片 | 在线观看国产一区二区三区 | 国产乱人伦av在线无码 | 欧美激情一区二区三区成人 | 国产特级毛片aaaaaaa高清 | 精品国产福利一区二区 | 国产麻豆精品一区二区三区v视界 | 人人妻人人澡人人爽人人精品浪潮 | 欧美黑人性暴力猛交喷水 | 成人免费视频视频在线观看 免费 | 日日干夜夜干 | 久久天天躁狠狠躁夜夜免费观看 | 欧美激情综合亚洲一二区 | 午夜理论片yy44880影院 | 久久zyz资源站无码中文动漫 | 久久这里只有精品视频9 | 男女性色大片免费网站 | 樱花草在线播放免费中文 | 国产精品二区一区二区aⅴ污介绍 | 精品少妇爆乳无码av无码专区 | 伊人久久大香线蕉av一区二区 | 爱做久久久久久 | 亚洲综合无码一区二区三区 | 人人妻人人澡人人爽精品欧美 | 亚洲の无码国产の无码步美 | 亚洲熟妇色xxxxx亚洲 | 久久久久久久久蜜桃 | 全黄性性激高免费视频 | 2020久久香蕉国产线看观看 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲精品一区二区三区在线观看 | 成人性做爰aaa片免费看 | 久久精品国产99久久6动漫 | 少妇高潮一区二区三区99 | 精品国产一区av天美传媒 | 欧美老妇交乱视频在线观看 | 东京热男人av天堂 | 又大又紧又粉嫩18p少妇 | 国产激情无码一区二区app | 国产凸凹视频一区二区 | аⅴ资源天堂资源库在线 | www国产亚洲精品久久网站 | 搡女人真爽免费视频大全 | 午夜成人1000部免费视频 | 小泽玛莉亚一区二区视频在线 | 久久精品中文字幕大胸 | 全黄性性激高免费视频 | 人人妻人人澡人人爽精品欧美 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 中国大陆精品视频xxxx | 牲欲强的熟妇农村老妇女视频 | www国产亚洲精品久久网站 | 欧美精品一区二区精品久久 | 久久精品国产大片免费观看 | 欧美性猛交xxxx富婆 | 波多野结衣av一区二区全免费观看 | 久久99精品久久久久久 | 国产日产欧产精品精品app | 在线播放无码字幕亚洲 | 久久人人爽人人爽人人片ⅴ | 亚洲爆乳无码专区 | 日韩人妻系列无码专区 | av小次郎收藏 | 亚洲中文字幕无码中文字在线 | 国产在线精品一区二区高清不卡 | 中文亚洲成a人片在线观看 | 亚洲 激情 小说 另类 欧美 | 国产激情精品一区二区三区 | 国产xxx69麻豆国语对白 | 女人被男人躁得好爽免费视频 | 免费无码肉片在线观看 | 熟妇激情内射com | 亚洲国产日韩a在线播放 | 又大又硬又黄的免费视频 | 国产办公室秘书无码精品99 | 在线天堂新版最新版在线8 | 成人aaa片一区国产精品 | 亚洲成a人片在线观看无码3d | 精品aⅴ一区二区三区 | 欧美zoozzooz性欧美 | 国产精品亚洲lv粉色 | 精品夜夜澡人妻无码av蜜桃 | 中文字幕中文有码在线 | 97色伦图片97综合影院 | 搡女人真爽免费视频大全 | 国产精品18久久久久久麻辣 | 成人精品视频一区二区 | 欧美人与物videos另类 | 无码午夜成人1000部免费视频 | 免费无码肉片在线观看 | 国产人妻人伦精品1国产丝袜 | 夜夜高潮次次欢爽av女 | 亚洲成色在线综合网站 | 亚洲综合伊人久久大杳蕉 | 午夜福利试看120秒体验区 | 天堂久久天堂av色综合 | 日本护士毛茸茸高潮 | 中文字幕精品av一区二区五区 | 无码人妻丰满熟妇区毛片18 | 大色综合色综合网站 | 精品国产麻豆免费人成网站 | 亚洲国产精品一区二区美利坚 | 久久久精品欧美一区二区免费 | 亚洲精品一区二区三区婷婷月 | 女高中生第一次破苞av | 中文字幕+乱码+中文字幕一区 | 爆乳一区二区三区无码 | 亚洲精品久久久久久久久久久 | 色 综合 欧美 亚洲 国产 | 中文字幕乱妇无码av在线 | 精品国偷自产在线视频 | 色综合久久久久综合一本到桃花网 | 人妻夜夜爽天天爽三区 | 国产欧美熟妇另类久久久 | 2019午夜福利不卡片在线 | 久久综合激激的五月天 | 亚洲国产午夜精品理论片 | 最近的中文字幕在线看视频 | 中文字幕精品av一区二区五区 | a在线观看免费网站大全 | 久久午夜无码鲁丝片 | 国产精品丝袜黑色高跟鞋 | 国产精品无码成人午夜电影 | 娇妻被黑人粗大高潮白浆 | 又紧又大又爽精品一区二区 | 色妞www精品免费视频 | 免费国产成人高清在线观看网站 | 久久久久se色偷偷亚洲精品av | 美女毛片一区二区三区四区 | 伊人久久大香线蕉av一区二区 | 99久久亚洲精品无码毛片 | 中文字幕av伊人av无码av | 无码国内精品人妻少妇 | 牛和人交xxxx欧美 | yw尤物av无码国产在线观看 | 日韩人妻系列无码专区 | 日本护士毛茸茸高潮 | 亚洲另类伦春色综合小说 | 在线а√天堂中文官网 | 日本免费一区二区三区最新 | 亚洲熟妇色xxxxx欧美老妇y | 夜夜高潮次次欢爽av女 | 国产在线一区二区三区四区五区 | 丰满护士巨好爽好大乳 | 欧美激情综合亚洲一二区 | 丰满岳乱妇在线观看中字无码 | 亚洲无人区一区二区三区 | 亚洲中文字幕成人无码 | 亚洲一区二区三区 | 丝袜美腿亚洲一区二区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产激情无码一区二区app | 无码人妻久久一区二区三区不卡 | 一本色道久久综合亚洲精品不卡 | 亚洲国产欧美日韩精品一区二区三区 | 久久99热只有频精品8 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲国产一区二区三区在线观看 | 国色天香社区在线视频 | 少妇高潮一区二区三区99 | 国产乱人伦av在线无码 | 欧美freesex黑人又粗又大 | 亚洲日韩中文字幕在线播放 | 亚洲乱亚洲乱妇50p | 未满成年国产在线观看 | 久9re热视频这里只有精品 | 日日摸日日碰夜夜爽av | 亚洲一区二区三区无码久久 | 九九综合va免费看 | 精品久久久久久亚洲精品 | 国产精品.xx视频.xxtv | 全球成人中文在线 | 亚洲熟悉妇女xxx妇女av | 老司机亚洲精品影院无码 | 国产一区二区三区精品视频 | 久久熟妇人妻午夜寂寞影院 | 久久五月精品中文字幕 | 天堂在线观看www | 午夜精品一区二区三区在线观看 | 天堂久久天堂av色综合 | 欧美性猛交内射兽交老熟妇 | 综合激情五月综合激情五月激情1 | 一区二区三区乱码在线 | 欧洲 | 久久 国产 尿 小便 嘘嘘 | 久久精品国产日本波多野结衣 | 色综合天天综合狠狠爱 | 国产精品手机免费 | 内射老妇bbwx0c0ck | 四虎国产精品一区二区 | 国产成人无码专区 | 国产精品爱久久久久久久 | 欧美 日韩 人妻 高清 中文 | 欧美性猛交xxxx富婆 | 久久国产精品精品国产色婷婷 | 丰满人妻一区二区三区免费视频 | 老熟妇仑乱视频一区二区 | 久久久国产一区二区三区 | 又大又硬又黄的免费视频 | 2019nv天堂香蕉在线观看 | 青青久在线视频免费观看 | 国产xxx69麻豆国语对白 | 国产成人精品视频ⅴa片软件竹菊 | 熟妇女人妻丰满少妇中文字幕 | 天天综合网天天综合色 | 国产欧美熟妇另类久久久 | 少女韩国电视剧在线观看完整 | 色婷婷综合中文久久一本 | 久久久久久亚洲精品a片成人 | 装睡被陌生人摸出水好爽 | 久久亚洲日韩精品一区二区三区 | 一个人看的www免费视频在线观看 | 国产深夜福利视频在线 | 国产精品永久免费视频 | 人人澡人人透人人爽 | 亚洲无人区午夜福利码高清完整版 | 精品偷拍一区二区三区在线看 | 亚洲精品美女久久久久久久 | 亚洲爆乳大丰满无码专区 | 久久99精品久久久久久动态图 | 黑人粗大猛烈进出高潮视频 | 日韩 欧美 动漫 国产 制服 | 中文精品无码中文字幕无码专区 | 丰满妇女强制高潮18xxxx | 亚洲综合久久一区二区 | 国产熟妇高潮叫床视频播放 | 国产精品-区区久久久狼 | 久久久久se色偷偷亚洲精品av | 日日噜噜噜噜夜夜爽亚洲精品 | 国产在线精品一区二区三区直播 | 亚洲人成网站免费播放 | 天下第一社区视频www日本 | 色欲人妻aaaaaaa无码 | 精品人人妻人人澡人人爽人人 | 2019午夜福利不卡片在线 | 无码乱肉视频免费大全合集 | 亚洲精品中文字幕 | 一本久道久久综合婷婷五月 | 亚洲码国产精品高潮在线 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产成人无码区免费内射一片色欲 | 欧美性生交xxxxx久久久 | 中文字幕无码视频专区 | 午夜精品久久久久久久久 | 国产精品久久国产精品99 | 特级做a爰片毛片免费69 | 偷窥村妇洗澡毛毛多 | 国产精品国产自线拍免费软件 | 精品厕所偷拍各类美女tp嘘嘘 | 欧美 日韩 人妻 高清 中文 | av香港经典三级级 在线 | 亚洲小说春色综合另类 | 国产精品毛片一区二区 | 久久精品视频在线看15 | 亚洲中文字幕无码一久久区 | 无码av中文字幕免费放 | 久久精品国产大片免费观看 | 日韩少妇白浆无码系列 | 国产手机在线αⅴ片无码观看 | 伊人久久大香线蕉午夜 | 亚洲人成人无码网www国产 | 乱人伦人妻中文字幕无码久久网 | 人人超人人超碰超国产 | 亚洲精品久久久久中文第一幕 | 久久天天躁狠狠躁夜夜免费观看 | 草草网站影院白丝内射 | 18精品久久久无码午夜福利 | 1000部夫妻午夜免费 | 欧美性猛交xxxx富婆 | 亚洲成熟女人毛毛耸耸多 | 男女作爱免费网站 | 日本精品高清一区二区 | 丝袜人妻一区二区三区 | 久久99精品久久久久久动态图 | 中文字幕乱码人妻无码久久 | 国产高清不卡无码视频 | 亚洲大尺度无码无码专区 | 成人三级无码视频在线观看 | 国产亚洲精品久久久久久久久动漫 | 日韩精品成人一区二区三区 | 黄网在线观看免费网站 | 亚洲日韩中文字幕在线播放 | 亚洲日韩av一区二区三区四区 | 亚洲色大成网站www | 1000部夫妻午夜免费 | 国产无套粉嫩白浆在线 | 成人一区二区免费视频 | 亚洲国产精品美女久久久久 | 亚洲色大成网站www国产 | 美女扒开屁股让男人桶 | 国产精品国产自线拍免费软件 | 久久综合给合久久狠狠狠97色 | а√天堂www在线天堂小说 | 两性色午夜免费视频 | 人人超人人超碰超国产 | 丰满人妻精品国产99aⅴ | 给我免费的视频在线观看 | 国产内射老熟女aaaa | 亚洲一区二区三区播放 | 377p欧洲日本亚洲大胆 | 妺妺窝人体色www在线小说 | 欧美35页视频在线观看 | 色五月五月丁香亚洲综合网 | 免费视频欧美无人区码 | 好爽又高潮了毛片免费下载 | 又黄又爽又色的视频 | 99久久无码一区人妻 | 欧美激情综合亚洲一二区 | 亚洲中文字幕无码中字 | 国产国产精品人在线视 | 丝袜足控一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 亚洲熟熟妇xxxx | 久久99精品久久久久久 | 丰满人妻翻云覆雨呻吟视频 | 久久亚洲a片com人成 | 无套内谢的新婚少妇国语播放 | 国产乱人偷精品人妻a片 | 亚洲国产精品无码一区二区三区 | 国产精品永久免费视频 | 99久久亚洲精品无码毛片 | 高潮毛片无遮挡高清免费视频 | 欧洲极品少妇 | 无码人妻精品一区二区三区下载 | 欧美老妇与禽交 | 97无码免费人妻超级碰碰夜夜 | 丝袜足控一区二区三区 | 全球成人中文在线 | 久久久久av无码免费网 | 亚洲精品一区二区三区大桥未久 | 国产麻豆精品一区二区三区v视界 | 成熟妇人a片免费看网站 | 成 人影片 免费观看 | 久久亚洲a片com人成 | 全黄性性激高免费视频 | 水蜜桃av无码 | 久久精品中文闷骚内射 | 熟妇人妻无码xxx视频 | 丰满护士巨好爽好大乳 | 国语精品一区二区三区 | 精品人人妻人人澡人人爽人人 | 无码国产激情在线观看 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品久免费的黄网站 | 成人无码影片精品久久久 | 中文字幕无线码免费人妻 | 中文字幕日韩精品一区二区三区 | 亚洲精品午夜国产va久久成人 | 免费看男女做好爽好硬视频 | av人摸人人人澡人人超碰下载 | 亚洲日韩av一区二区三区中文 | 亚洲男人av香蕉爽爽爽爽 | 成熟人妻av无码专区 | 精品无码一区二区三区的天堂 | 亚洲午夜福利在线观看 | 高潮毛片无遮挡高清免费 | 国产绳艺sm调教室论坛 | 久久人妻内射无码一区三区 | 亚洲国产精品久久人人爱 | 国产两女互慰高潮视频在线观看 | 丰满人妻被黑人猛烈进入 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 麻豆精品国产精华精华液好用吗 | 亚洲乱亚洲乱妇50p | 丰满少妇女裸体bbw | 亚洲精品国偷拍自产在线麻豆 | 桃花色综合影院 | 欧美性生交xxxxx久久久 | 亚洲成在人网站无码天堂 | 亚洲色欲色欲欲www在线 | 日本一区二区三区免费高清 | 亚洲经典千人经典日产 | 天天拍夜夜添久久精品大 | 18黄暴禁片在线观看 | 日本一本二本三区免费 | 午夜男女很黄的视频 | 亚洲国产av精品一区二区蜜芽 | 国产一区二区不卡老阿姨 | 免费无码午夜福利片69 | 亚洲欧美国产精品专区久久 | 无码一区二区三区在线 | 久久久久久a亚洲欧洲av冫 | 一本色道久久综合亚洲精品不卡 | 人人澡人人妻人人爽人人蜜桃 | 欧美成人高清在线播放 | 少妇被黑人到高潮喷出白浆 | 欧美日韩一区二区三区自拍 | 少妇人妻av毛片在线看 | 亚洲乱码国产乱码精品精 | 任你躁在线精品免费 | 成人精品视频一区二区 | 日本护士xxxxhd少妇 | 久久久亚洲欧洲日产国码αv | 精品国精品国产自在久国产87 | 一本色道婷婷久久欧美 | 亚洲乱码国产乱码精品精 | 亚洲午夜福利在线观看 | 双乳奶水饱满少妇呻吟 | 日韩人妻少妇一区二区三区 | 夜夜高潮次次欢爽av女 | 精品 日韩 国产 欧美 视频 | 国产精品成人av在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久天天躁狠狠躁夜夜免费观看 | 一本大道久久东京热无码av | 精品亚洲韩国一区二区三区 | 亚洲国产欧美在线成人 | 国产精品久久久av久久久 | 丝袜 中出 制服 人妻 美腿 | 77777熟女视频在线观看 а天堂中文在线官网 | 中文毛片无遮挡高清免费 | 亚洲精品一区三区三区在线观看 | 男人的天堂av网站 | 色综合久久网 | 初尝人妻少妇中文字幕 | 国产免费无码一区二区视频 | 领导边摸边吃奶边做爽在线观看 | 九九久久精品国产免费看小说 | 久久久久久av无码免费看大片 | 国产超级va在线观看视频 | 成人免费视频视频在线观看 免费 | 一本精品99久久精品77 | 鲁鲁鲁爽爽爽在线视频观看 | 国产va免费精品观看 | 中文字幕 人妻熟女 | 亚洲乱码国产乱码精品精 | 精品乱码久久久久久久 | 午夜精品一区二区三区在线观看 | 最近中文2019字幕第二页 | 国产av一区二区精品久久凹凸 | 欧美怡红院免费全部视频 | 国色天香社区在线视频 | 少妇人妻av毛片在线看 | 精品久久久中文字幕人妻 | 色欲人妻aaaaaaa无码 | 日韩亚洲欧美中文高清在线 | 国产精品va在线观看无码 | 丰满人妻精品国产99aⅴ | 亚洲色偷偷男人的天堂 | 妺妺窝人体色www在线小说 | 久久久久久av无码免费看大片 | 亚洲中文无码av永久不收费 | 东北女人啪啪对白 | 久久综合网欧美色妞网 | 色欲久久久天天天综合网精品 | 天天做天天爱天天爽综合网 | 老熟妇仑乱视频一区二区 | 久久久无码中文字幕久... | 欧洲精品码一区二区三区免费看 | 国产精品美女久久久网av | 人人爽人人澡人人高潮 | 国产乱人无码伦av在线a | 国产农村妇女高潮大叫 | 国产熟妇高潮叫床视频播放 | 欧美亚洲国产一区二区三区 | 亚洲精品一区二区三区婷婷月 | 欧美人与物videos另类 | 亚洲熟女一区二区三区 | 国产精品对白交换视频 | www成人国产高清内射 | √天堂中文官网8在线 | 女人高潮内射99精品 | 久青草影院在线观看国产 | 自拍偷自拍亚洲精品被多人伦好爽 | 色婷婷综合中文久久一本 | 性色av无码免费一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产97人人超碰caoprom | 精品欧洲av无码一区二区三区 | 乌克兰少妇xxxx做受 | 国产日产欧产精品精品app | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 日韩精品无码一本二本三本色 | 亚洲精品成人av在线 | 又色又爽又黄的美女裸体网站 | 日韩欧美成人免费观看 | 色婷婷久久一区二区三区麻豆 | 久久久国产精品无码免费专区 | 欧美freesex黑人又粗又大 | 人人妻人人澡人人爽人人精品浪潮 | 人妻少妇精品久久 | 亚洲国产精品毛片av不卡在线 | 国产精品99久久精品爆乳 | 性欧美videos高清精品 | 天天av天天av天天透 | 成人免费视频在线观看 | 久久综合给久久狠狠97色 | 亚洲综合久久一区二区 | 国产精品久久国产精品99 | 一本精品99久久精品77 | 国产亚洲欧美在线专区 | 日本xxxx色视频在线观看免费 | 亚洲欧美综合区丁香五月小说 | 黑人粗大猛烈进出高潮视频 | 欧美日韩在线亚洲综合国产人 | 精品国产国产综合精品 | 色欲人妻aaaaaaa无码 | 东京一本一道一二三区 | 国产在线精品一区二区高清不卡 | 美女极度色诱视频国产 | 大地资源中文第3页 | 蜜臀aⅴ国产精品久久久国产老师 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产成人av免费观看 | 色欲综合久久中文字幕网 | 免费无码av一区二区 | 帮老师解开蕾丝奶罩吸乳网站 | 国内揄拍国内精品人妻 | 久久99精品国产麻豆蜜芽 | 久久久国产精品无码免费专区 | 国产女主播喷水视频在线观看 | 未满小14洗澡无码视频网站 | 九月婷婷人人澡人人添人人爽 | 国产婷婷色一区二区三区在线 | 天海翼激烈高潮到腰振不止 | 国产莉萝无码av在线播放 | 久久人人97超碰a片精品 | 丰满人妻一区二区三区免费视频 | 三级4级全黄60分钟 | 国产无遮挡又黄又爽免费视频 | 亚洲一区二区三区国产精华液 | 中文字幕日韩精品一区二区三区 | 国产精品久久久久久亚洲影视内衣 | 亚洲中文字幕在线无码一区二区 | 青春草在线视频免费观看 | 天天做天天爱天天爽综合网 | 无码中文字幕色专区 | 亚洲最大成人网站 | 中文亚洲成a人片在线观看 | 人人爽人人澡人人人妻 | 日本一区二区更新不卡 | 久久aⅴ免费观看 | 高中生自慰www网站 | 亚洲成a人一区二区三区 | 色偷偷人人澡人人爽人人模 | 国语精品一区二区三区 | 亚洲一区av无码专区在线观看 | 亚洲区小说区激情区图片区 | 一本色道久久综合亚洲精品不卡 | 色欲久久久天天天综合网精品 | 任你躁在线精品免费 | 天天拍夜夜添久久精品 | 荫蒂被男人添的好舒服爽免费视频 | 色婷婷av一区二区三区之红樱桃 | 人妻少妇精品久久 | 无码国产乱人伦偷精品视频 | 岛国片人妻三上悠亚 | 色综合视频一区二区三区 | 国产午夜福利100集发布 | 人人妻人人藻人人爽欧美一区 | 国产精品久久久久无码av色戒 | 成人精品视频一区二区 | 国产精品办公室沙发 | 国产无遮挡吃胸膜奶免费看 | 亚洲一区二区三区香蕉 | 亚洲爆乳精品无码一区二区三区 | 色综合久久中文娱乐网 | 人妻体内射精一区二区三四 | 性做久久久久久久免费看 | 99久久精品午夜一区二区 | 人妻少妇精品视频专区 | 国产成人无码av在线影院 | 人妻人人添人妻人人爱 | 丁香花在线影院观看在线播放 | 无码av中文字幕免费放 | 97夜夜澡人人爽人人喊中国片 | 欧美色就是色 | 精品国产国产综合精品 | 精品久久久无码人妻字幂 | 无码人妻黑人中文字幕 | 欧美日本精品一区二区三区 | 亚洲第一网站男人都懂 | 亚洲乱码国产乱码精品精 | 国产va免费精品观看 | 黑人粗大猛烈进出高潮视频 | 中文字幕无线码 | 中文字幕乱码人妻二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 日本肉体xxxx裸交 | 一区二区传媒有限公司 | 六十路熟妇乱子伦 | 国产色在线 | 国产 | 久久亚洲中文字幕无码 | 亚洲一区二区三区播放 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 色婷婷综合中文久久一本 | 日日摸天天摸爽爽狠狠97 | 一本无码人妻在中文字幕免费 | 国产熟妇另类久久久久 | 国产精品无码成人午夜电影 | 久久人人爽人人爽人人片av高清 | 熟女少妇在线视频播放 | 国产农村妇女高潮大叫 | 又紧又大又爽精品一区二区 | 人人妻人人澡人人爽欧美一区九九 | 免费国产黄网站在线观看 | 人人妻人人藻人人爽欧美一区 | 久久99精品国产麻豆 | 久久zyz资源站无码中文动漫 | 乱码午夜-极国产极内射 | 亚洲精品久久久久中文第一幕 | 亚洲成av人影院在线观看 | 欧美熟妇另类久久久久久多毛 | 亚洲呦女专区 | 亚洲精品国产品国语在线观看 | 精品无码av一区二区三区 | 欧美大屁股xxxxhd黑色 | 人妻互换免费中文字幕 | 无码av岛国片在线播放 | 老司机亚洲精品影院无码 | 日本一区二区更新不卡 | 国产乱人无码伦av在线a | 久久成人a毛片免费观看网站 | 亚洲男人av天堂午夜在 | 久久婷婷五月综合色国产香蕉 | 综合人妻久久一区二区精品 | 六月丁香婷婷色狠狠久久 | 55夜色66夜色国产精品视频 | 丰满妇女强制高潮18xxxx | 久久综合九色综合欧美狠狠 | 免费播放一区二区三区 | 给我免费的视频在线观看 | 国产免费久久久久久无码 | 亚洲欧洲无卡二区视頻 | 99国产精品白浆在线观看免费 | 国产亚洲美女精品久久久2020 | 人人超人人超碰超国产 | 国产一区二区三区影院 | 熟妇人妻无乱码中文字幕 | 亚洲s码欧洲m码国产av | 无套内谢的新婚少妇国语播放 | 色婷婷综合中文久久一本 | 高中生自慰www网站 | www成人国产高清内射 | 丰满妇女强制高潮18xxxx | 一区二区三区高清视频一 | 丰满少妇高潮惨叫视频 | 亚洲欧美日韩成人高清在线一区 | 无码av免费一区二区三区试看 | 激情综合激情五月俺也去 | 日本爽爽爽爽爽爽在线观看免 | 一本无码人妻在中文字幕免费 | 亚洲精品鲁一鲁一区二区三区 | 日产精品高潮呻吟av久久 | 东京热一精品无码av | 特黄特色大片免费播放器图片 | 亚洲熟熟妇xxxx | 午夜不卡av免费 一本久久a久久精品vr综合 | 亚洲一区二区三区无码久久 | 日韩在线不卡免费视频一区 | 国产成人人人97超碰超爽8 | 国产一区二区三区四区五区加勒比 | 对白脏话肉麻粗话av | 免费人成在线观看网站 | 在线a亚洲视频播放在线观看 | 精品久久久无码中文字幕 | 午夜福利一区二区三区在线观看 | 蜜桃无码一区二区三区 | 人妻少妇精品无码专区二区 | 日韩欧美中文字幕在线三区 | 亚洲 激情 小说 另类 欧美 | 亚洲国产av精品一区二区蜜芽 | 人妻无码αv中文字幕久久琪琪布 | 亚洲va欧美va天堂v国产综合 | 国产精品亚洲综合色区韩国 | 国产一区二区三区日韩精品 | 国产亚洲精品久久久久久久久动漫 | 国产亚洲精品久久久ai换 | 国产午夜亚洲精品不卡下载 | 国产成人精品久久亚洲高清不卡 | 国产精品99爱免费视频 | 免费国产成人高清在线观看网站 | 成人精品天堂一区二区三区 | 免费观看激色视频网站 | 色欲综合久久中文字幕网 | 欧美人与善在线com | 少妇性l交大片 | 影音先锋中文字幕无码 | 成人性做爰aaa片免费看 | 亚洲乱码日产精品bd | 国产绳艺sm调教室论坛 | 大地资源中文第3页 | 亚洲国产午夜精品理论片 | 黑人巨大精品欧美一区二区 | 最近免费中文字幕中文高清百度 | 亚洲精品无码国产 | 日本精品人妻无码77777 天堂一区人妻无码 | 无码播放一区二区三区 | 搡女人真爽免费视频大全 | 国产激情精品一区二区三区 | 色综合久久久无码网中文 | 日韩人妻系列无码专区 | 亚洲一区二区三区含羞草 | 大乳丰满人妻中文字幕日本 | 色综合久久久无码网中文 | 国产suv精品一区二区五 | 精品欧美一区二区三区久久久 | 亚洲一区二区三区在线观看网站 | 国产在线精品一区二区三区直播 | 在线欧美精品一区二区三区 | 欧美高清在线精品一区 | 少女韩国电视剧在线观看完整 | 久久无码中文字幕免费影院蜜桃 | 久久精品丝袜高跟鞋 | 国产手机在线αⅴ片无码观看 | 欧美真人作爱免费视频 | 亚洲热妇无码av在线播放 | 永久黄网站色视频免费直播 | 亚洲成色www久久网站 | 男女猛烈xx00免费视频试看 | 久久国产精品二国产精品 | 欧美熟妇另类久久久久久多毛 | 亚洲国产精品无码一区二区三区 | 又大又硬又黄的免费视频 | 丰满妇女强制高潮18xxxx | 亚洲综合无码久久精品综合 | 国产又爽又猛又粗的视频a片 | 伦伦影院午夜理论片 | 中文字幕人成乱码熟女app | 人妻互换免费中文字幕 | 久久久久成人片免费观看蜜芽 | 无人区乱码一区二区三区 | 亚洲a无码综合a国产av中文 | 免费观看黄网站 | av小次郎收藏 | 国产色视频一区二区三区 | 色综合久久久久综合一本到桃花网 | 亚洲精品一区三区三区在线观看 | 少妇被粗大的猛进出69影院 | 性色欲网站人妻丰满中文久久不卡 | 国产真实乱对白精彩久久 | 特大黑人娇小亚洲女 | 国产无套粉嫩白浆在线 | www国产亚洲精品久久久日本 | 粗大的内捧猛烈进出视频 | а√资源新版在线天堂 | 中文字幕人妻无码一夲道 | 纯爱无遮挡h肉动漫在线播放 | 国产香蕉97碰碰久久人人 | 伊人久久大香线蕉亚洲 | 久久国产自偷自偷免费一区调 | 无码人妻出轨黑人中文字幕 | 香蕉久久久久久av成人 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕无码av激情不卡 | 中文字幕乱码人妻二区三区 | 久久久www成人免费毛片 | 亚洲另类伦春色综合小说 | 7777奇米四色成人眼影 | 台湾无码一区二区 | 无码av最新清无码专区吞精 | 亚洲va中文字幕无码久久不卡 | 牛和人交xxxx欧美 | 无码成人精品区在线观看 | 2019午夜福利不卡片在线 | 免费男性肉肉影院 | 国产精品久久久久久亚洲影视内衣 | 三上悠亚人妻中文字幕在线 | 亚洲 高清 成人 动漫 | 亚洲天堂2017无码中文 | 色欲综合久久中文字幕网 | 久久综合激激的五月天 | 国产两女互慰高潮视频在线观看 | 六十路熟妇乱子伦 | 欧美国产日产一区二区 | 最新国产麻豆aⅴ精品无码 | 国产精品高潮呻吟av久久4虎 | 粗大的内捧猛烈进出视频 | 亚洲第一网站男人都懂 | 亚洲精品一区二区三区婷婷月 | 亚洲综合无码一区二区三区 | 男女性色大片免费网站 | 国产精品亚洲专区无码不卡 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久久久人妻一区精品色欧美 | 日本熟妇大屁股人妻 | 国产精品手机免费 | 99re在线播放 | 国产精品嫩草久久久久 | 国产真人无遮挡作爱免费视频 | 亚洲中文字幕在线无码一区二区 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲人成网站色7799 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 欧美大屁股xxxxhd黑色 | 精品一区二区三区无码免费视频 | 亚洲男女内射在线播放 | 欧美野外疯狂做受xxxx高潮 | 精品厕所偷拍各类美女tp嘘嘘 | 久久综合网欧美色妞网 | 成在人线av无码免观看麻豆 | 国产午夜福利100集发布 | 四虎国产精品免费久久 | 男人的天堂2018无码 | 一本久道久久综合婷婷五月 | 国产免费无码一区二区视频 | 中文字幕亚洲情99在线 | 欧美丰满老熟妇xxxxx性 | 熟妇女人妻丰满少妇中文字幕 | 久久久久久久人妻无码中文字幕爆 | 久久无码专区国产精品s | 四虎4hu永久免费 | 麻豆国产丝袜白领秘书在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产热a欧美热a在线视频 | 青春草在线视频免费观看 | 成人性做爰aaa片免费看不忠 | 国产成人无码一二三区视频 | 成人性做爰aaa片免费看不忠 | 国产在线精品一区二区三区直播 | 狠狠噜狠狠狠狠丁香五月 | 沈阳熟女露脸对白视频 | www成人国产高清内射 | 国产成人无码区免费内射一片色欲 | 国产亚洲精品久久久闺蜜 | 中文字幕+乱码+中文字幕一区 | 精品国产精品久久一区免费式 | 精品一二三区久久aaa片 | 日本饥渴人妻欲求不满 | 麻豆蜜桃av蜜臀av色欲av | 特大黑人娇小亚洲女 | 久久综合给久久狠狠97色 | 久久人人爽人人爽人人片av高清 | 乌克兰少妇xxxx做受 | 丰满少妇人妻久久久久久 | 狠狠色噜噜狠狠狠7777奇米 | 国产色在线 | 国产 | 欧美人妻一区二区三区 | 国产精品亚洲五月天高清 | 丁香花在线影院观看在线播放 | 欧美黑人巨大xxxxx | 国产精品99久久精品爆乳 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲男人av天堂午夜在 | 无码一区二区三区在线观看 | 亚洲午夜久久久影院 | 免费男性肉肉影院 | 波多野结衣 黑人 | 沈阳熟女露脸对白视频 | 国产免费久久久久久无码 | 激情亚洲一区国产精品 | 日韩人妻少妇一区二区三区 | 乌克兰少妇性做爰 | 中文字幕色婷婷在线视频 | 日韩av无码中文无码电影 | 在线观看国产一区二区三区 | 午夜不卡av免费 一本久久a久久精品vr综合 | 又大又硬又爽免费视频 | 伊人久久大香线焦av综合影院 | 无码av最新清无码专区吞精 | 久久亚洲a片com人成 | 全黄性性激高免费视频 | www一区二区www免费 | 亚洲国产欧美日韩精品一区二区三区 | 97资源共享在线视频 | 久久综合九色综合欧美狠狠 | 久久久久se色偷偷亚洲精品av | 天天做天天爱天天爽综合网 | 精品久久久久香蕉网 | 国产电影无码午夜在线播放 | 欧美黑人乱大交 | 亚洲精品久久久久久久久久久 | 亚洲国产精品毛片av不卡在线 | 成人亚洲精品久久久久软件 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品永久免费视频 | 天天做天天爱天天爽综合网 | 亚洲一区二区三区国产精华液 | 成人精品视频一区二区 | 麻豆国产人妻欲求不满 | 色婷婷香蕉在线一区二区 | 永久免费精品精品永久-夜色 | 女高中生第一次破苞av | 亚洲国产欧美在线成人 | 日本护士xxxxhd少妇 | 亚洲欧美国产精品久久 | 熟妇女人妻丰满少妇中文字幕 | 国产偷自视频区视频 | 久久久亚洲欧洲日产国码αv | 国产欧美精品一区二区三区 | 亚洲一区二区三区播放 | 久久五月精品中文字幕 | 色偷偷人人澡人人爽人人模 | 国产精品无码一区二区三区不卡 | 日韩av激情在线观看 | 亚洲小说春色综合另类 | 国产精品久久福利网站 | 国产内射爽爽大片视频社区在线 | 国产真实夫妇视频 | 日本熟妇大屁股人妻 | 久久 国产 尿 小便 嘘嘘 | 久热国产vs视频在线观看 | 亚洲成a人片在线观看日本 | 国产人成高清在线视频99最全资源 | 亚洲欧美色中文字幕在线 | 无码帝国www无码专区色综合 | 久久 国产 尿 小便 嘘嘘 | 学生妹亚洲一区二区 | 亚洲欧美日韩综合久久久 | 人人澡人人妻人人爽人人蜜桃 | 婷婷六月久久综合丁香 | 少妇性俱乐部纵欲狂欢电影 | 国产熟妇另类久久久久 | 无码人妻av免费一区二区三区 | 国产精品美女久久久网av | 婷婷色婷婷开心五月四房播播 | 免费网站看v片在线18禁无码 | 亚洲国产综合无码一区 | 永久免费精品精品永久-夜色 | 久青草影院在线观看国产 | 欧美成人家庭影院 | 色综合久久久无码中文字幕 | 日本一卡2卡3卡四卡精品网站 | 国产性生大片免费观看性 | 露脸叫床粗话东北少妇 | 又黄又爽又色的视频 | 成人三级无码视频在线观看 | 成年美女黄网站色大免费全看 | 日本高清一区免费中文视频 | 精品人妻av区 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 少妇久久久久久人妻无码 | 久久久久久av无码免费看大片 | 久久综合狠狠综合久久综合88 | 女人和拘做爰正片视频 | 色综合视频一区二区三区 | 免费观看激色视频网站 | 欧美一区二区三区视频在线观看 | 亚洲成av人影院在线观看 | 成年美女黄网站色大免费全看 | 成 人 网 站国产免费观看 | 300部国产真实乱 | 无码人妻久久一区二区三区不卡 | 国产无套内射久久久国产 | 色五月五月丁香亚洲综合网 | 国产麻豆精品精东影业av网站 | 成 人 免费观看网站 | 国产suv精品一区二区五 | 久久久久av无码免费网 | 精品偷拍一区二区三区在线看 | 国产精品对白交换视频 | 久久综合网欧美色妞网 | 99久久人妻精品免费二区 | 国产激情一区二区三区 | 日本肉体xxxx裸交 | 国产精品美女久久久久av爽李琼 | 一本加勒比波多野结衣 | 亚洲娇小与黑人巨大交 | 成人三级无码视频在线观看 | 国产精品人人爽人人做我的可爱 | 亚洲中文字幕在线无码一区二区 | 88国产精品欧美一区二区三区 | 色综合久久久无码网中文 | 18无码粉嫩小泬无套在线观看 | 久久99精品久久久久久动态图 | 欧美国产日韩久久mv | 熟女俱乐部五十路六十路av | 中文字幕无线码 | 国产激情艳情在线看视频 | 亚洲熟妇色xxxxx亚洲 | 一本无码人妻在中文字幕免费 | 无码免费一区二区三区 | 一本色道久久综合亚洲精品不卡 | 成熟妇人a片免费看网站 | 欧美日韩人成综合在线播放 | 国精产品一品二品国精品69xx | 波多野结衣一区二区三区av免费 | 成人免费视频视频在线观看 免费 | 中文字幕人妻无码一区二区三区 | 天天做天天爱天天爽综合网 | 国産精品久久久久久久 | 国产成人精品视频ⅴa片软件竹菊 | 99久久人妻精品免费一区 | 国产精品久久国产三级国 | 国内综合精品午夜久久资源 | 一本久久a久久精品亚洲 | 欧美国产日韩亚洲中文 | 亚洲色大成网站www | 日本精品久久久久中文字幕 | 日本饥渴人妻欲求不满 | 呦交小u女精品视频 | 精品人妻人人做人人爽 | 九九热爱视频精品 | 麻豆国产丝袜白领秘书在线观看 | 精品国产成人一区二区三区 | 国内少妇偷人精品视频免费 | 日本肉体xxxx裸交 | 精品久久8x国产免费观看 | 亚洲大尺度无码无码专区 | 特级做a爰片毛片免费69 | 色婷婷综合激情综在线播放 | 狂野欧美性猛xxxx乱大交 | www成人国产高清内射 | 鲁大师影院在线观看 | 亚洲成a人一区二区三区 | 国产精品无套呻吟在线 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 欧美 日韩 亚洲 在线 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕乱码亚洲无线三区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 成人精品视频一区二区三区尤物 | 国产肉丝袜在线观看 | 欧美一区二区三区 | 久久精品国产一区二区三区肥胖 | 性色欲情网站iwww九文堂 | 亚洲精品国偷拍自产在线观看蜜桃 | 2020久久香蕉国产线看观看 | 色一情一乱一伦一视频免费看 | 成人精品天堂一区二区三区 | 亚洲呦女专区 | 久久久久久久人妻无码中文字幕爆 | 综合激情五月综合激情五月激情1 | 丰满护士巨好爽好大乳 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲综合另类小说色区 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产美女极度色诱视频www | 日韩精品一区二区av在线 | 国产97色在线 | 免 | 久久国产精品萌白酱免费 | 亚洲阿v天堂在线 | 亚洲中文字幕在线无码一区二区 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲 另类 在线 欧美 制服 | 日本大乳高潮视频在线观看 | 亚洲人成人无码网www国产 | 鲁鲁鲁爽爽爽在线视频观看 | 又粗又大又硬毛片免费看 | 精品熟女少妇av免费观看 | 国产99久久精品一区二区 | 漂亮人妻洗澡被公强 日日躁 | 强开小婷嫩苞又嫩又紧视频 | 丰满少妇人妻久久久久久 | 亚洲欧美日韩综合久久久 | 久久99精品国产.久久久久 | 亚洲成av人综合在线观看 | 在线亚洲高清揄拍自拍一品区 | 丰满少妇人妻久久久久久 | 久久精品国产一区二区三区肥胖 | 国产成人无码区免费内射一片色欲 | 国产香蕉97碰碰久久人人 | 亚洲午夜福利在线观看 | 又大又硬又黄的免费视频 | a片在线免费观看 | 精品欧洲av无码一区二区三区 | 欧洲美熟女乱又伦 | 亚洲高清偷拍一区二区三区 | 色婷婷久久一区二区三区麻豆 | 欧美freesex黑人又粗又大 | 日韩人妻无码一区二区三区久久99 | 中文字幕乱妇无码av在线 | 亚洲爆乳大丰满无码专区 | 国产亚av手机在线观看 | 综合激情五月综合激情五月激情1 | 欧美变态另类xxxx | 18禁黄网站男男禁片免费观看 | 人人妻人人澡人人爽精品欧美 | 精品人妻人人做人人爽夜夜爽 | 精品久久久久久亚洲精品 | 人妻少妇被猛烈进入中文字幕 | 亚洲春色在线视频 | 300部国产真实乱 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧洲vodafone精品性 | 亚洲一区二区三区 | 乱人伦中文视频在线观看 | 人妻中文无码久热丝袜 | 无码人妻精品一区二区三区下载 | 免费无码肉片在线观看 | 亚洲国产精品一区二区第一页 | 性欧美疯狂xxxxbbbb | 精品偷拍一区二区三区在线看 | 图片区 小说区 区 亚洲五月 | 国产精品久久久久影院嫩草 | aa片在线观看视频在线播放 | 99在线 | 亚洲 | 精品久久久中文字幕人妻 | 久久久久久久女国产乱让韩 | 内射欧美老妇wbb | 欧美性猛交xxxx富婆 | 亚洲欧美精品伊人久久 | 亚洲午夜久久久影院 | 伊人久久大香线焦av综合影院 | 国产人妻精品一区二区三区 | 国产人妖乱国产精品人妖 | 美女极度色诱视频国产 | 国产内射老熟女aaaa | 国产精品亚洲专区无码不卡 | 好男人社区资源 | 亚洲成熟女人毛毛耸耸多 | 精品国产av色一区二区深夜久久 | 性啪啪chinese东北女人 | 日产精品99久久久久久 | 蜜桃臀无码内射一区二区三区 | www国产亚洲精品久久网站 | 久久99精品久久久久久 | 午夜性刺激在线视频免费 | 久久精品中文字幕大胸 | 久久久久久久人妻无码中文字幕爆 | 亚洲国产午夜精品理论片 | 国产卡一卡二卡三 | 久久人人爽人人爽人人片av高清 | 久久久久av无码免费网 | 国产精品自产拍在线观看 | 丰满少妇人妻久久久久久 | www国产亚洲精品久久网站 | 国产亚av手机在线观看 | 国产免费无码一区二区视频 | 成人性做爰aaa片免费看不忠 | 亚洲熟熟妇xxxx | 三上悠亚人妻中文字幕在线 | 精品人妻人人做人人爽夜夜爽 | 国产精品久久久av久久久 | 55夜色66夜色国产精品视频 | 性欧美大战久久久久久久 | 沈阳熟女露脸对白视频 | 99久久精品午夜一区二区 | 久久zyz资源站无码中文动漫 | 熟妇女人妻丰满少妇中文字幕 | 国产精品亚洲综合色区韩国 | 亚洲成在人网站无码天堂 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 婷婷色婷婷开心五月四房播播 | 欧美亚洲日韩国产人成在线播放 | 中文字幕日产无线码一区 | 极品尤物被啪到呻吟喷水 | 老熟妇仑乱视频一区二区 | 久久久精品456亚洲影院 | 免费乱码人妻系列无码专区 | 成人影院yy111111在线观看 | 97久久超碰中文字幕 | 午夜嘿嘿嘿影院 | 欧美精品一区二区精品久久 | 国产精品亚洲五月天高清 | 国产精品人人妻人人爽 | 国产超碰人人爽人人做人人添 | 18精品久久久无码午夜福利 | 中文字幕av伊人av无码av | 人人妻人人澡人人爽欧美一区 | 中文毛片无遮挡高清免费 | 欧美喷潮久久久xxxxx | 激情内射亚州一区二区三区爱妻 | 日本丰满护士爆乳xxxx | 亚洲毛片av日韩av无码 | 国产欧美熟妇另类久久久 | 亚洲一区av无码专区在线观看 | 熟女俱乐部五十路六十路av | 蜜桃臀无码内射一区二区三区 | 俄罗斯老熟妇色xxxx | 好爽又高潮了毛片免费下载 | 久久国产劲爆∧v内射 | 久久久久久久久888 | 精品久久久久香蕉网 | 欧美日韩人成综合在线播放 | 妺妺窝人体色www婷婷 | 永久免费观看美女裸体的网站 | 性欧美疯狂xxxxbbbb | 纯爱无遮挡h肉动漫在线播放 | 亚洲自偷精品视频自拍 | 亚洲中文字幕无码中字 | 亚洲 a v无 码免 费 成 人 a v | 中文字幕乱码人妻二区三区 | 国产成人亚洲综合无码 | 亚洲精品久久久久久一区二区 | 久久精品国产精品国产精品污 | 99精品无人区乱码1区2区3区 | 国产成人一区二区三区别 | 成人女人看片免费视频放人 | 亚洲综合久久一区二区 | 青春草在线视频免费观看 | 日本在线高清不卡免费播放 | 高清不卡一区二区三区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产精品人人爽人人做我的可爱 | 国产精品久久精品三级 | 久久久无码中文字幕久... | 欧美野外疯狂做受xxxx高潮 | 鲁一鲁av2019在线 | 国产精品18久久久久久麻辣 | 成人女人看片免费视频放人 | 麻豆精产国品 | 日韩成人一区二区三区在线观看 | 俺去俺来也www色官网 | 国产精品视频免费播放 | 国产超碰人人爽人人做人人添 | 美女张开腿让人桶 | 水蜜桃色314在线观看 | 国产一区二区三区四区五区加勒比 | 精品久久久久久亚洲精品 | 欧美日韩精品 | 精品亚洲韩国一区二区三区 | 久久人人爽人人爽人人片ⅴ | 无套内谢的新婚少妇国语播放 | 人妻aⅴ无码一区二区三区 | 欧洲精品码一区二区三区免费看 | 国产精品va在线观看无码 | 动漫av一区二区在线观看 | 日本大香伊一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 精品午夜福利在线观看 | 成在人线av无码免观看麻豆 | 国产综合久久久久鬼色 | 少妇高潮一区二区三区99 | 中文字幕av伊人av无码av | 自拍偷自拍亚洲精品10p | 人妻少妇精品久久 | 久久99精品国产麻豆 | 国产av人人夜夜澡人人爽麻豆 | 强开小婷嫩苞又嫩又紧视频 | 精品国产福利一区二区 | 亚洲人成网站在线播放942 | 亚洲s色大片在线观看 | 久9re热视频这里只有精品 | 激情亚洲一区国产精品 | 国产精品亚洲专区无码不卡 | 国产一区二区不卡老阿姨 | 国产精品美女久久久久av爽李琼 | 国产97人人超碰caoprom | 在线播放亚洲第一字幕 | 一区二区传媒有限公司 | 亚洲人成人无码网www国产 | 中文字幕 人妻熟女 | 亚洲一区av无码专区在线观看 | 蜜桃视频韩日免费播放 | 欧美猛少妇色xxxxx | 国产综合久久久久鬼色 | 国产免费久久久久久无码 | 成人亚洲精品久久久久 | 丰满人妻一区二区三区免费视频 | 日日躁夜夜躁狠狠躁 | 国产精品二区一区二区aⅴ污介绍 | 女人色极品影院 | 天天爽夜夜爽夜夜爽 | 日本一区二区三区免费播放 | 又紧又大又爽精品一区二区 | 国内揄拍国内精品人妻 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产手机在线αⅴ片无码观看 | 久久无码中文字幕免费影院蜜桃 | 香港三级日本三级妇三级 | 国产亚av手机在线观看 | а√天堂www在线天堂小说 | 亚洲最大成人网站 | 国产艳妇av在线观看果冻传媒 | 久在线观看福利视频 | 午夜精品一区二区三区的区别 | 麻豆精品国产精华精华液好用吗 | 亚洲欧美日韩国产精品一区二区 | 人妻有码中文字幕在线 | 老司机亚洲精品影院无码 | 国产乱子伦视频在线播放 | 国产av一区二区精品久久凹凸 | 无码国内精品人妻少妇 | 欧洲精品码一区二区三区免费看 | 丰满人妻被黑人猛烈进入 | 人妻少妇精品无码专区二区 | 久久熟妇人妻午夜寂寞影院 | 成人毛片一区二区 | 国产xxx69麻豆国语对白 | 亚洲精品一区三区三区在线观看 | 国产精品二区一区二区aⅴ污介绍 | 亚洲日韩中文字幕在线播放 | 国产激情综合五月久久 | 99视频精品全部免费免费观看 | 亚洲国产精品成人久久蜜臀 | 亚洲成色在线综合网站 | 丰满人妻翻云覆雨呻吟视频 | 人妻插b视频一区二区三区 | 国精产品一品二品国精品69xx | 欧美丰满熟妇xxxx性ppx人交 | 婷婷五月综合激情中文字幕 | 成年美女黄网站色大免费全看 | 国产9 9在线 | 中文 | 成人精品视频一区二区三区尤物 | 国产三级精品三级男人的天堂 | 国产成人无码一二三区视频 | 国产精品沙发午睡系列 | 亚洲熟悉妇女xxx妇女av | 在线观看国产午夜福利片 | 亚洲欧美色中文字幕在线 | 日本丰满熟妇videos | 午夜肉伦伦影院 | 无码av最新清无码专区吞精 | 老熟妇乱子伦牲交视频 | 日本又色又爽又黄的a片18禁 | 国产乱人无码伦av在线a | 免费视频欧美无人区码 | 乱中年女人伦av三区 | 中文字幕av伊人av无码av | 一本久久伊人热热精品中文字幕 | 中文字幕乱码人妻二区三区 | 日本大香伊一区二区三区 | 乱人伦中文视频在线观看 | 久久人人97超碰a片精品 | 亚洲色欲色欲欲www在线 | 精品无码av一区二区三区 | 欧美性猛交xxxx富婆 | 国产精品无码成人午夜电影 | 又黄又爽又色的视频 | 中文字幕av日韩精品一区二区 | 好男人www社区 | 熟妇人妻无乱码中文字幕 | 日韩av无码中文无码电影 | 国产成人av免费观看 | 欧美激情综合亚洲一二区 | 久久久久久av无码免费看大片 | 久激情内射婷内射蜜桃人妖 | 亚洲第一网站男人都懂 | 免费看少妇作爱视频 | 国产猛烈高潮尖叫视频免费 | 国产黑色丝袜在线播放 | 真人与拘做受免费视频 | 国产97在线 | 亚洲 | 青草视频在线播放 | 国产精品igao视频网 | 亚洲a无码综合a国产av中文 | 亚洲欧美综合区丁香五月小说 | 国产精品爱久久久久久久 | 欧美日韩亚洲国产精品 | 免费无码的av片在线观看 | 国产免费久久精品国产传媒 | 丁香花在线影院观看在线播放 | 国产无遮挡又黄又爽免费视频 | 国产精品久久久久9999小说 | 国产亚洲精品久久久久久 | 又大又硬又爽免费视频 | 初尝人妻少妇中文字幕 | 亚洲欧美日韩成人高清在线一区 | 亚洲欧美中文字幕5发布 | 九月婷婷人人澡人人添人人爽 | 无码精品国产va在线观看dvd | 又色又爽又黄的美女裸体网站 | 大屁股大乳丰满人妻 | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文字幕av无码一区二区三区电影 | 国产两女互慰高潮视频在线观看 | 国产成人精品无码播放 | 亚洲中文字幕久久无码 | 99麻豆久久久国产精品免费 | 性欧美牲交在线视频 | 亚洲狠狠婷婷综合久久 | 乱人伦人妻中文字幕无码久久网 | 日本一区二区三区免费播放 | 国产精品亚洲综合色区韩国 | 亚洲精品综合五月久久小说 | 俺去俺来也在线www色官网 | 精品 日韩 国产 欧美 视频 | 国产精品内射视频免费 | 日本护士毛茸茸高潮 | 熟妇人妻无乱码中文字幕 | 国产高潮视频在线观看 | 三级4级全黄60分钟 | 国产亚洲精品久久久闺蜜 | 丰满人妻精品国产99aⅴ | 99国产精品白浆在线观看免费 | 久久人妻内射无码一区三区 | 中文字幕 亚洲精品 第1页 | 一个人看的视频www在线 | 国产成人人人97超碰超爽8 | 娇妻被黑人粗大高潮白浆 | 免费无码的av片在线观看 | 蜜桃无码一区二区三区 | 无码国产色欲xxxxx视频 | 欧美精品免费观看二区 | 国产凸凹视频一区二区 | 亚洲熟妇自偷自拍另类 | 色婷婷综合激情综在线播放 | 亚洲人成无码网www | 秋霞特色aa大片 | 中文字幕人妻无码一区二区三区 | 欧美真人作爱免费视频 | 成人欧美一区二区三区 | 色一情一乱一伦一区二区三欧美 | 在线a亚洲视频播放在线观看 | 99精品国产综合久久久久五月天 | 狠狠躁日日躁夜夜躁2020 | 欧美真人作爱免费视频 | 国产亚洲精品久久久久久久久动漫 | 久久亚洲a片com人成 | 一区二区三区高清视频一 | 秋霞特色aa大片 | √8天堂资源地址中文在线 | 老熟妇仑乱视频一区二区 | 天堂无码人妻精品一区二区三区 | 亚洲人成网站在线播放942 | 久久精品中文字幕大胸 | 国产在热线精品视频 | 中文久久乱码一区二区 | 久久亚洲日韩精品一区二区三区 | 无码精品国产va在线观看dvd | av人摸人人人澡人人超碰下载 | 亚洲熟妇色xxxxx欧美老妇 | 天堂久久天堂av色综合 | 亚洲精品欧美二区三区中文字幕 | 久久精品中文字幕大胸 | 国产无遮挡吃胸膜奶免费看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 老司机亚洲精品影院无码 | 久久精品国产一区二区三区肥胖 | 午夜福利试看120秒体验区 | 永久免费观看国产裸体美女 | 国产精品igao视频网 | 亚洲伊人久久精品影院 | 日本精品高清一区二区 | 免费观看黄网站 | 久久国产精品精品国产色婷婷 | 中文字幕av伊人av无码av | 亚洲综合无码久久精品综合 | 精品人妻人人做人人爽夜夜爽 | 99麻豆久久久国产精品免费 | 国产人妻人伦精品 | 国产高清av在线播放 | 无码人妻精品一区二区三区不卡 | 亚洲日本一区二区三区在线 | 亚洲人成无码网www | 国产人妻精品一区二区三区 | 黑人粗大猛烈进出高潮视频 | 久久精品人人做人人综合 | 色偷偷人人澡人人爽人人模 | 久久亚洲a片com人成 | 欧美xxxxx精品 | 综合人妻久久一区二区精品 | 日日橹狠狠爱欧美视频 | 强开小婷嫩苞又嫩又紧视频 | 波多野结衣高清一区二区三区 | 装睡被陌生人摸出水好爽 | 色窝窝无码一区二区三区色欲 | 在线播放免费人成毛片乱码 | 99久久人妻精品免费二区 | 内射后入在线观看一区 | 国产精品久久久av久久久 | 欧美阿v高清资源不卡在线播放 | 久久五月精品中文字幕 | 亚洲精品一区二区三区婷婷月 | 国产成人无码av片在线观看不卡 | 福利一区二区三区视频在线观看 | 国产精品欧美成人 | 午夜理论片yy44880影院 | 国产艳妇av在线观看果冻传媒 | 欧美黑人性暴力猛交喷水 | 天天摸天天透天天添 | 国产亚洲精品久久久闺蜜 | 亚洲一区二区三区含羞草 | 少妇久久久久久人妻无码 | 99麻豆久久久国产精品免费 | 精品一区二区三区波多野结衣 | 人妻无码αv中文字幕久久琪琪布 | 亚洲精品国产精品乱码视色 | 牲交欧美兽交欧美 | 人妻无码久久精品人妻 | 中文字幕无码乱人伦 | 动漫av一区二区在线观看 | 娇妻被黑人粗大高潮白浆 | 亚洲精品鲁一鲁一区二区三区 | 欧美性猛交内射兽交老熟妇 | 麻豆人妻少妇精品无码专区 | 国产精品igao视频网 | 无码毛片视频一区二区本码 | 日本精品久久久久中文字幕 | 一本色道久久综合狠狠躁 | 欧美精品免费观看二区 | 欧美日韩综合一区二区三区 | 久久亚洲a片com人成 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲成av人片天堂网无码】 | 激情综合激情五月俺也去 | 狠狠色欧美亚洲狠狠色www | 性欧美videos高清精品 | 精品欧美一区二区三区久久久 | 欧美熟妇另类久久久久久多毛 | 牲欲强的熟妇农村老妇女 | 在线视频网站www色 | 亚洲成a人片在线观看无码3d | 日韩成人一区二区三区在线观看 | 亚洲国产精品无码一区二区三区 | 亚洲成色www久久网站 | 色爱情人网站 | 男女爱爱好爽视频免费看 | 精品一区二区不卡无码av | 一区二区三区乱码在线 | 欧洲 | 国产精品亚洲lv粉色 | 中文字幕 亚洲精品 第1页 | 67194成是人免费无码 | 国产9 9在线 | 中文 | a在线亚洲男人的天堂 | aa片在线观看视频在线播放 | 全黄性性激高免费视频 | 东京热无码av男人的天堂 | 在线亚洲高清揄拍自拍一品区 | 76少妇精品导航 | 色综合久久久久综合一本到桃花网 | а天堂中文在线官网 | 人妻与老人中文字幕 | 色噜噜亚洲男人的天堂 | 亚洲成色www久久网站 | 中文字幕精品av一区二区五区 | 99re在线播放 | 99久久99久久免费精品蜜桃 | a国产一区二区免费入口 | 国产一区二区三区日韩精品 | 人妻无码久久精品人妻 | 好男人社区资源 | 99久久人妻精品免费一区 | 色婷婷av一区二区三区之红樱桃 | 色综合久久中文娱乐网 | 丝袜人妻一区二区三区 | 狠狠色噜噜狠狠狠7777奇米 | 午夜理论片yy44880影院 | 欧美一区二区三区视频在线观看 | 国产欧美熟妇另类久久久 | 免费观看黄网站 | 欧美性猛交内射兽交老熟妇 | 六十路熟妇乱子伦 | 欧美丰满熟妇xxxx | 亚洲a无码综合a国产av中文 | 精品久久综合1区2区3区激情 | 久久久久久久人妻无码中文字幕爆 | 日本一卡2卡3卡四卡精品网站 | 久久久久成人片免费观看蜜芽 | 内射老妇bbwx0c0ck | 色婷婷综合激情综在线播放 | 中文字幕人妻无码一区二区三区 | 熟妇人妻无乱码中文字幕 | 男女下面进入的视频免费午夜 | 久久国产精品萌白酱免费 | 玩弄少妇高潮ⅹxxxyw | 国产精品99久久精品爆乳 | 精品无码一区二区三区爱欲 | 内射老妇bbwx0c0ck | 国产av一区二区三区最新精品 | 亚洲欧美综合区丁香五月小说 | 最近中文2019字幕第二页 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美国产日产一区二区 | 国产av人人夜夜澡人人爽麻豆 | 99在线 | 亚洲 | 日本又色又爽又黄的a片18禁 | 精品厕所偷拍各类美女tp嘘嘘 | 国产内射爽爽大片视频社区在线 | 999久久久国产精品消防器材 | 亚洲男人av天堂午夜在 | 亚洲午夜无码久久 | 无码av免费一区二区三区试看 | 野外少妇愉情中文字幕 | 日韩少妇白浆无码系列 | 久久99精品国产.久久久久 | 婷婷色婷婷开心五月四房播播 | 99精品视频在线观看免费 | 国产美女精品一区二区三区 | 国产三级久久久精品麻豆三级 | 无码纯肉视频在线观看 | 国产黄在线观看免费观看不卡 | 日韩精品a片一区二区三区妖精 | 亚洲色偷偷偷综合网 | 精品久久综合1区2区3区激情 | 亚洲成a人一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 色综合久久久久综合一本到桃花网 | 18禁黄网站男男禁片免费观看 | 免费乱码人妻系列无码专区 | 久久久av男人的天堂 | 少妇久久久久久人妻无码 | 无码国产色欲xxxxx视频 | 欧美第一黄网免费网站 | 麻豆人妻少妇精品无码专区 | 中文字幕久久久久人妻 | 女人被爽到呻吟gif动态图视看 | 色婷婷综合中文久久一本 | 国产成人久久精品流白浆 | 99国产欧美久久久精品 | 久久国产精品偷任你爽任你 | 亚洲综合伊人久久大杳蕉 | 纯爱无遮挡h肉动漫在线播放 | 少妇一晚三次一区二区三区 | 老头边吃奶边弄进去呻吟 | 亚洲色偷偷男人的天堂 | 秋霞特色aa大片 | 国产真实乱对白精彩久久 | 国产电影无码午夜在线播放 | 亚洲乱码国产乱码精品精 | 欧美老人巨大xxxx做受 | 国产精品久久久久7777 | 国产精品高潮呻吟av久久4虎 | 久热国产vs视频在线观看 | 熟妇人妻无码xxx视频 | 中文无码成人免费视频在线观看 | 国产精品.xx视频.xxtv | 精品国产一区二区三区四区在线看 | 人妻少妇被猛烈进入中文字幕 | 国产精品久久久久影院嫩草 | 人妻少妇精品视频专区 | 亚洲熟妇色xxxxx欧美老妇y | 一区二区三区乱码在线 | 欧洲 | 日韩精品无码一区二区中文字幕 | 人人妻人人澡人人爽欧美一区九九 | 少妇性l交大片欧洲热妇乱xxx | 久久99精品久久久久久 | 狠狠色欧美亚洲狠狠色www | 曰本女人与公拘交酡免费视频 | 精品国产一区二区三区四区在线看 | 图片区 小说区 区 亚洲五月 | 亚洲一区二区三区含羞草 | 亚洲成色www久久网站 | 国产精品福利视频导航 | 欧美大屁股xxxxhd黑色 | 国产午夜福利亚洲第一 | 亚洲综合在线一区二区三区 | 久久综合激激的五月天 | 亚洲 日韩 欧美 成人 在线观看 | 国产美女极度色诱视频www | 激情五月综合色婷婷一区二区 | 成人免费视频在线观看 | 乱人伦人妻中文字幕无码久久网 | 久久 国产 尿 小便 嘘嘘 | 图片区 小说区 区 亚洲五月 | 国产精品香蕉在线观看 | 国产亚洲人成a在线v网站 | 久激情内射婷内射蜜桃人妖 | 国产激情精品一区二区三区 | 高潮毛片无遮挡高清免费 | 99久久精品日本一区二区免费 | 亚洲精品一区二区三区四区五区 | 波多野结衣aⅴ在线 | 国产suv精品一区二区五 | 熟妇人妻激情偷爽文 | 精品久久久久香蕉网 | 久久精品人人做人人综合试看 | 亚洲乱码中文字幕在线 | 国产人妻大战黑人第1集 | 国产av剧情md精品麻豆 | 欧美喷潮久久久xxxxx | 成年美女黄网站色大免费视频 | 天天做天天爱天天爽综合网 | 国产麻豆精品一区二区三区v视界 | 两性色午夜视频免费播放 | 亚洲精品久久久久久久久久久 | 精品 日韩 国产 欧美 视频 | 欧美亚洲日韩国产人成在线播放 | 亚洲精品国产精品乱码不卡 | 99久久久无码国产精品免费 | 久久伊人色av天堂九九小黄鸭 | 无码人妻黑人中文字幕 | 老熟女乱子伦 | 国产在线无码精品电影网 | 玩弄中年熟妇正在播放 | 午夜免费福利小电影 | 熟妇女人妻丰满少妇中文字幕 | 人妻与老人中文字幕 |