日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Django DRF路由與擴展功能的實現

瀏覽:306日期:2024-09-29 18:34:57

一. 視圖集與路由的使用

使用視圖集ViewSet,可以將一系列邏輯相關的動作放到一個類中:

list() 提供一組數據 retrieve() 提供單個數據 create() 創建數據 update() 保存數據 destory() 刪除數據

ViewSet視圖集類不再實現get()、post()等方法,而是實現動作 action 如 list() 、create() 等。

視圖集只在使用as_view()方法的時候,才會將action動作與具體請求方式對應上。

1. 常用的視圖集父類

1.ViewSet

繼承自APIView 與 ViewSetMixin作用也與APIView基本類似,提供了身份認證、權限校驗、流量管理等。

ViewSet主要通過繼承ViewSetMixin來實現在調用as_view()時傳入字典(如{’get’:’list’})的映射處理工作。

在ViewSet中,沒有提供任何動作action方法,需要我們自己實現action方法。

2.GenericViewSet

使用ViewSet通常并不方便,因為list、retrieve、create、update、destory等方法都需要自己編寫,而這些方法與前面講過的Mixin擴展類提供的方法同名,所以我們可以通過繼承Mixin擴展類來復用這些方法而無需自己編寫。但是Mixin擴展類依賴與GenericAPIView,所以還需要繼承GenericAPIView。

GenericViewSet就幫助我們完成了這樣的繼承工作,繼承自GenericAPIView與ViewSetMixin,在實現了調用as_view()時傳入字典(如{’get’:’list’})的映射處理工作的同時,還提供了GenericAPIView提供的基礎方法,可以直接搭配Mixin擴展類使用。

3.ModelViewSet

繼承自GenericViewSet,同時包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4.ReadOnlyModelViewSet

繼承自GenericViewSet,同時包括了ListModelMixin、RetrieveModelMixin。

下面我們還是通過案例,為大家演示吧!

首先,先創建一個子應用。

python3 manage.py startapp collect

5. 在collect下新建序列化器類

# collect下的serializers.py文件from students.models import Studentfrom rest_framework import serializersclass StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = ['id', 'name', 'age', 'sex'] extra_kwargs = { 'name': {'max_length': 10, 'min_length': 4}, 'age': {'max_value': 150, 'min_value': 0}, } def validate_name(self, data): if data == 'root': raise serializers.ValidationError('用戶名不能為root!') return data def validate(self, attrs): name = attrs.get(’name’) age = attrs.get(’age’) if name == 'alex' and age == 22: raise serializers.ValidationError('alex在22時的故事。。。') return attrsclass StudentInfoModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = ['id', 'name']

6. collect下的urls.py

from django.urls import path, re_pathfrom collect import viewsurlpatterns = [ # 不要在同一個路由的as_view中書寫兩個同樣的鍵的http請求,會產生覆蓋!!! # ViewSet path(’student1/’, views.Student1ViewSet.as_view({'get': 'get_5'})), path(’student1/get_5_girl/’, views.Student1ViewSet.as_view({'get': 'get_5_girl'})), re_path(r’^student1/(?P<pk>d+)/$’, views.Student1ViewSet.as_view({'get': 'get_one'})), # GenericViewSet path(’student2/’, views.Student3GenericViewSet.as_view({'get': 'get_5'})), path(’student2/get_5_girl/’, views.Student3GenericViewSet.as_view({'get': 'get_5_girl'})), # GenericViewSet,可以和模型類進行組合快速生成基本的API接口 path('students3/', views.Student4GenericViewSet.as_view({'get': 'list', 'post': 'create'})), # ModelViewSet 默認提供了5個API接口 path('students4/', views.Student5ModelViewSet.as_view({'post': 'create', 'get': 'list'})), re_path(r'^students4/(?P<pk>d+)/$', views.Student5ModelViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), # ReadOnlyModelViewSet path('students5/', views.Student6ReadOnlyModelViewSet.as_view({'get': 'list'})), re_path(r'^students5/(?P<pk>d+)/$', views.Student6ReadOnlyModelViewSet.as_view({'get': 'retrieve'})), # 一個視圖類中調用多個序列化器 path('student8/', views.Student8GenericAPIView.as_view()), # 一個視圖集中調用多個序列化器 path('student9/', views.Student9ModelViewSet.as_view({'get': 'list'})), re_path(r'^student9/(?P<pk>d+)/$', views.Student9ModelViewSet.as_view({'get': 'retrieve'})),]'''有了視圖集以后,視圖文件中多個視圖類可以合并成一個,但是,路由的代碼就變得復雜了,需要我們經常在as_view方法 ,編寫http請求和視圖方法的對應關系,事實上,在路由中,DRF也提供了一個路由類給我們對路由的代碼進行簡寫。當然,這個路由類僅針對于 視圖集 才可以使用。'''# 路由類默認只會給視圖集中的基本5個API生成地址[ 獲取一條,獲取多條,添加.刪除,修改數據 ]from rest_framework.routers import DefaultRouter# 實例化路由類router = DefaultRouter()# router.register('訪問地址前綴','視圖集類','訪問別名')# 注冊視圖視圖集類router.register('student7', views.Student7ModelViewSet)# 把路由列表注冊到django項目中urlpatterns += router.urls

7. collect下的views.py

'''ViewSet視圖集,繼承于APIView,所以APIView有的功能,它都有,APIView沒有的功能,它也沒有'''from rest_framework.viewsets import ViewSetfrom students.models import Studentfrom .serializers import StudentModelSerializerfrom rest_framework.response import Responseclass Student1ViewSet(ViewSet): def get_5(self, request): student_list = Student.objects.all()[:5] serializer = StudentModelSerializer(instance=student_list, many=True) return Response(serializer.data) def get_one(self, request, pk): student = Student.objects.get(pk=pk) serializer = StudentModelSerializer(instance=student) return Response(serializer.data) def get_5_girl(self, request): student_list = Student.objects.filter(sex=False)[:5] serializer = StudentModelSerializer(instance=student_list, many=True) return Response(serializer.data)'''如果希望在視圖集中調用GenericAPIView的功能,則可以采用下面方式'''from rest_framework.generics import GenericAPIViewclass Student2ViewSet(ViewSet, GenericAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer def get_5(self, request): student_list = self.get_queryset()[:5] serializer = StudentModelSerializer(instance=student_list, many=True) return Response(serializer.data) def get_one(self, request, pk): student = self.get_object() serializer = StudentModelSerializer(instance=student) return Response(serializer.data) def get_5_girl(self, request): student_list = self.get_queryset().filter(sex=False)[:5] serializer = StudentModelSerializer(instance=student_list, many=True) return Response(serializer.data)'''上面的方式,雖然實現視圖集中調用GenericAPIView,但是我們要多了一些類的繼承。所以我們可以直接繼承 GenericViewSet'''from rest_framework.viewsets import GenericViewSetclass Student3GenericViewSet(GenericViewSet): serializer_class = StudentModelSerializer queryset = Student.objects.all() def get_5(self, request): student_list = self.get_queryset()[:5] serializer = self.get_serializer(instance=student_list, many=True) return Response(serializer.data) def get_5_girl(self, request): student_list = self.get_queryset().filter(sex=False)[:5] serializer = self.get_serializer(instance=student_list, many=True) return Response(serializer.data)'''在使用GenericViewSet時,雖然已經提供了基本調用數據集(queryset)和序列化器屬性,但是我們要編寫一些基本的API時,還是需要調用DRF提供的模型擴展類 [Mixins]'''from rest_framework.viewsets import GenericViewSetfrom rest_framework.mixins import ListModelMixin, CreateModelMixinclass Student4GenericViewSet(GenericViewSet, ListModelMixin, CreateModelMixin): queryset = Student.objects.all() serializer_class = StudentModelSerializerfrom rest_framework.viewsets import ModelViewSetclass Student5ModelViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer# 只讀模型視圖集from rest_framework.viewsets import ReadOnlyModelViewSetclass Student6ReadOnlyModelViewSet(ReadOnlyModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer# 路由的使用from rest_framework.decorators import actionclass Student7ModelViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer # methods 指定允許哪些http請求訪問當前視圖方法 # detail 指定生成的路由地址中是否要夾帶pk值,True為需要 @action(methods=['GET'], detail=False) def get_6(self, request): serilizer = self.get_serializer(instance=self.get_queryset().get(pk=6)) return Response(serilizer.data)'''在多個視圖類合并成一個視圖類以后,那么有時候會出現一個類中需要調用多個序列化器''''''1. 在視圖類中調用多個序列化器''''''原來的視圖類中基本上一個視圖類只會調用一個序列化器,當然也有可能要調用多個序列化器'''from .serializers import StudentInfoModelSerializerclass Student8GenericAPIView(GenericAPIView): queryset = Student.objects.all() # GenericAPI內部調用序列化器的方法,我們可以重寫這個方法來實現根據不同的需求來調用不同的序列化器 def get_serializer_class(self): if self.request.method == 'GET': # 2個字段 return StudentInfoModelSerializer return StudentModelSerializer def get(self, request): '''獲取所有數據的id和name''' student_list = self.get_queryset() serializer = self.get_serializer(instance=student_list, many=True) return Response(serializer.data) def post(self, request): '''添加數據''' data = request.data serializer = self.get_serializer(data=data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data)'''2. 在一個視圖集中調用多個序列化器'''class Student9ModelViewSet(ModelViewSet): queryset = Student.objects.all() '''要求: 列表數據list,返回2個字段, 詳情數據retrieve,返回所有字段, ''' def get_serializer_class(self): # 本次客戶端請求的視圖方法名 self.action if self.action == 'list': return StudentInfoModelSerializer return StudentModelSerializer

二. 擴展功能

為了方便接下來的學習,我們創建一個新的子應用 opt

python3 manage.py startapp opt

因為接下來的功能中需要使用到登錄功能,所以我們使用django內置admin站點并創建一個管理員.

創建管理員以后,訪問admin站點,先修改站點的語言配置,在settings里修改

LANGUAGE_CODE = ’zh-hans’

1. 認證Authentication

可以在配置文件中配置全局默認的認證方案

REST_FRAMEWORK = { ’DEFAULT_AUTHENTICATION_CLASSES’: ( ’rest_framework.authentication.SessionAuthentication’, # session認證 ’rest_framework.authentication.BasicAuthentication’, # 基本認證 )}

也可以在每個視圖中通過設置authentication_classess屬性來設置

opt下的urls.py

from django.urls import pathfrom opt import viewsurlpatterns = [ path(’auth1/’, views.Demo1APIView.as_view()), path(’auth2/’, views.Demo2APIView.as_view()),]

opt下的views.py

from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework.permissions import IsAuthenticated, IsAdminUser'''用戶的認證和權限識別'''class Demo1APIView(APIView): '''只允許登錄后的用戶訪問''' permission_classes = [IsAuthenticated] def get(self, request): '''個人中心''' return Response('個人中心')class Demo2APIView(APIView): '''只允許管理員訪問''' permission_classes = [IsAdminUser] def get(self, request): '''個人中心2''' return Response('個人中心2')

2. 權限Permissions

權限控制可以限制用戶對于視圖的訪問和對于具體數據對象的訪問。

在執行視圖的dispatch()方法前,會先進行視圖訪問權限的判斷 在通過get_object()獲取具體對象時,會進行模型對象訪問權限的判斷

內置提供的權限:

AllowAny 允許所有用戶 IsAuthenticated 僅通過認證的用戶 IsAdminUser 僅管理員用戶 IsAuthenticatedOrReadOnly 已經登陸認證的用戶可以對數據進行增刪改操作,沒有登陸認證的只能查看數據。

可以在配置文件中全局設置默認的權限管理類,如:

REST_FRAMEWORK = { .... ’DEFAULT_PERMISSION_CLASSES’: ( ’rest_framework.permissions.IsAuthenticated’, )}

如果未指明,則采用如下默認配置

’DEFAULT_PERMISSION_CLASSES’: ( ’rest_framework.permissions.AllowAny’,)

也可以在具體的視圖中通過permission_classes屬性來設置。

opt下的urls.py

urlpatterns = [ path(’auth1/’, views.Demo1APIView.as_view()), path(’auth2/’, views.Demo2APIView.as_view()), # 自定義權限 path(’auth3/’, views.Demo3APIView.as_view()),]

opt下的views.py

# 自定義權限from rest_framework.permissions import BasePermissionclass MyPermission(BasePermission): def has_permission(self, request, view): ''' 針對訪問視圖進行權限判斷 :param request: 本次操作的http請求對象 :param view: 本次訪問路由對應的視圖對象 :return: ''' if request.user.username == 'xiaoming': return True return Falseclass Demo3APIView(APIView): permission_classes = [MyPermission] def get(self, request): '''個人中心3''' return Response('個人中心3')

3. 限流Throttling

可以對接口訪問的頻次進行限制,以減輕服務器壓力。

一般用于付費購買次數,投票等場景使用.

可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES進行全局配置

REST_FRAMEWORK = { # 限流 ’DEFAULT_THROTTLE_CLASSES’: ( # 對全局進行設置 ’rest_framework.throttling.AnonRateThrottle’, ’rest_framework.throttling.UserRateThrottle’ ), ’DEFAULT_THROTTLE_RATES’: { ’anon’: ’3/hour’, ’user’: ’3/minute’, }}

DEFAULT_THROTTLE_RATES 可以使用 second, minute, hour 或day來指明周期。

也可以在具體視圖中通過throttle_classess屬性來配置

opt下的urls.py

urlpatterns = [ path(’auth1/’, views.Demo1APIView.as_view()), path(’auth2/’, views.Demo2APIView.as_view()), # 自定義權限 path(’auth3/’, views.Demo3APIView.as_view()), # 限流 path(’auth4/’, views.Demo4APIView.as_view()),]

opt下的views.py

# 限流from rest_framework.throttling import UserRateThrottle, AnonRateThrottleclass Demo4APIView(APIView): # throttle_classes = [UserRateThrottle, AnonRateThrottle] # 全局配置后,這里就不用指定 def get(self, request): '''投票頁面''' return Response('投票頁面')

4. 過濾Filtering

對于列表數據可能需要根據字段進行過濾,我們可以通過添加django-fitlter擴展來增強支持。

pip3 install django-filter

在配置文件里進行注冊

INSTALLED_APPS = [ ... ’django_filters’, # 需要注冊應用,]REST_FRAMEWORK = { ... ’DEFAULT_FILTER_BACKENDS’: (’django_filters.rest_framework.DjangoFilterBackend’,)}

在視圖中添加filter_fields屬性,指定可以過濾的字段。

opt下的urls.py

urlpatterns = [ path(’auth1/’, views.Demo1APIView.as_view()), path(’auth2/’, views.Demo2APIView.as_view()), # 自定義權限 path(’auth3/’, views.Demo3APIView.as_view()), # 限流 path(’auth4/’, views.Demo4APIView.as_view()), # 過濾 path(’data5/’, views.Demo5APIView.as_view()),]

opt下的views.py

# 過濾from rest_framework.generics import GenericAPIView, ListAPIViewfrom students.models import Studentfrom .serializers import StudentModelSerializerfrom django_filters.rest_framework import DjangoFilterBackendclass Demo5APIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer filter_backends = [DjangoFilterBackend] # 全局配置后,這里就不用指定了。 filter_fields = [’age’, 'id'] # 聲明過濾字段

5. 排序Ordering

對于列表數據,REST framework提供了OrderingFilter過濾器來幫助我們快速指明數據按照指定字段進行排序。

使用方法:

在類視圖中設置filter_backends,使用rest_framework.filters.OrderingFilter過濾器,REST framework會在請求的查詢字符串參數中檢查是否包含了ordering參數,如果包含了ordering參數,則按照ordering參數指明的排序字段對數據集進行排序。

前端可以傳遞的ordering參數的可選字段值需要在ordering_fields中指明。

opt下的urs.py

urlpatterns = [ path(’auth1/’, views.Demo1APIView.as_view()), path(’auth2/’, views.Demo2APIView.as_view()), # 自定義權限 path(’auth3/’, views.Demo3APIView.as_view()), # 限流 path(’auth4/’, views.Demo4APIView.as_view()), # 過濾 path(’data5/’, views.Demo5APIView.as_view()), # 排序 path(’data6/’, views.Demo6APIView.as_view()),]

opt下的views.py

# 排序from rest_framework.filters import OrderingFilterclass Demo6APIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer filter_backends = [DjangoFilterBackend, OrderingFilter] # 局部配置會覆蓋全局配置 filter_fields = [’id’, 'sex'] ordering_fields = [’id’, 'age']

6. 分頁Pagination

REST framework提供了分頁的支持。

我們可以在配置文件中設置全局的分頁方式,如:

REST_FRAMEWORK = { ’DEFAULT_PAGINATION_CLASS’: ’rest_framework.pagination.PageNumberPagination’, ’PAGE_SIZE’: 100 # 每頁數目}

也可通過自定義Pagination類,來為視圖添加不同分頁行為。在視圖中通過pagination_clas屬性來指明。

opt下的urls.py

urlpatterns = [ path(’auth1/’, views.Demo1APIView.as_view()), path(’auth2/’, views.Demo2APIView.as_view()), # 自定義權限 path(’auth3/’, views.Demo3APIView.as_view()), # 限流 path(’auth4/’, views.Demo4APIView.as_view()), # 過濾 path(’data5/’, views.Demo5APIView.as_view()), # 排序 path(’data6/’, views.Demo6APIView.as_view()), # 分頁 path(’data7/’, views.Demo7APIView.as_view()),]

opt下的views.py

# 分頁from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination'''1. 自定義分頁器,定制分頁的相關配置''''''# 頁碼分頁 PageNumberPagination前端訪問形式:GET http://127.0.0.1:8000/opt/data7/?page=4page=1 limit 0,10page=2 limit 10,20# 偏移量分頁 LimitOffsetPagination前端訪問形式:GET http://127.0.0.1:8000/opt/data7/?start=4&size=3start=0 limit 0,10start=10 limit 10,10start=20 limit 20,10'''class StandardPageNumberPagination(PageNumberPagination): '''分頁相關配置''' page_query_param = 'page' # 設置分頁頁碼關鍵字名 page_size = 3 # 設置每頁顯示數據條數 page_size_query_param = 'size' # 設置指定每頁大小的關鍵字名 max_page_size = 5 # 設置每頁顯示最大值class StandardLimitOffsetPagination(LimitOffsetPagination): default_limit = 2 # 默認限制,默認值與PAGE_SIZE設置一致 limit_query_param = 'size' # limit參數名 offset_query_param = 'start' # offset參數名 max_limit = 5 # 最大limit限制class Demo7APIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer # 分頁 # 頁碼分頁類 pagination_class = StandardPageNumberPagination # 偏移量分頁類 # pagination_class = StandardLimitOffsetPagination

注意:如果在視圖內關閉分頁功能,只需在視圖內設置

pagination_class = None

到此這篇關于Django DRF路由與擴展功能的實現的文章就介紹到這了,更多相關Django DRF路由與擴展內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲高清激情| 日韩大片在线播放| 日本不良网站在线观看| 欧美极品中文字幕| 青青伊人久久| 久久国产精品色av免费看| 在线观看亚洲精品福利片| 欧美日韩国产免费观看 | 中文欧美日韩| 视频福利一区| 国产综合婷婷| 亚洲少妇自拍| 四虎在线精品| 日韩av资源网| 久久亚洲精精品中文字幕| 国产在视频一区二区三区吞精| 国产成人精品一区二区三区免费| 日韩.com| 激情六月综合| 免费观看日韩电影| 日韩av字幕| 国产精品激情电影| 国产高潮在线| 久久久精品久久久久久96| 亚洲va在线| 免费观看在线色综合| 国产毛片精品久久| 日韩电影免费在线观看| 最新日韩欧美| 麻豆一区二区三区| 欧美综合另类| 国产精品一区二区中文字幕| 成人免费电影网址| 欧美日一区二区在线观看| 亚洲夜间福利| 国产中文欧美日韩在线| 麻豆亚洲精品| 日韩综合精品| 国产精品亚洲综合在线观看| 91精品国产福利在线观看麻豆| 亚洲美女91| 欧美成人基地| 久久精品五月| 国产精品中文字幕制服诱惑| 亚洲欧美高清| 欧美日韩在线观看视频小说| 青青国产精品| 免费美女久久99| 国产精品一区二区中文字幕| 激情自拍一区| 国产中文字幕一区二区三区| 婷婷综合五月| 成人国产精品一区二区网站| 在线亚洲免费| 欧美精品导航| 视频一区二区中文字幕| 久久久久久一区二区| 综合激情视频| 红桃视频国产精品| 丁香六月综合| 国产高清视频一区二区| 国产精品毛片在线| 久久久成人网| 国产精品视频一区二区三区四蜜臂| 亚洲成人精选| 日韩欧美一区免费| 欧美一区在线观看视频| 日本在线不卡视频一二三区| 激情欧美日韩一区| 久久av资源| 精品一区av| 国产成人a视频高清在线观看| 久久国产精品色av免费看| 中文在线日韩| 中文字幕日本一区二区| 日韩亚洲精品在线| 国产精品天堂蜜av在线播放| 日韩高清一区二区| 欧美日韩中文| 国产精品免费99久久久| 欧美aaaaaa午夜精品| 麻豆精品久久久| 美女视频黄 久久| 久久中文字幕一区二区| 91麻豆精品| 日韩精品a在线观看91| 国产精品麻豆成人av电影艾秋| 国产亚洲久久| 老牛国内精品亚洲成av人片| 久久香蕉精品香蕉| 高清不卡亚洲| 亚洲欧美久久精品| 日韩成人精品一区二区三区| 日本成人在线不卡视频| 国产精品99久久久久久董美香| 麻豆精品视频在线| 亚洲一区不卡| 蜜臀国产一区| 亚洲国产专区校园欧美| 亚洲日本国产| 日韩不卡免费视频| 麻豆国产精品777777在线| 成人精品动漫一区二区三区| 99精品视频精品精品视频| 国产精品v日韩精品v欧美精品网站| 欧美日韩精品免费观看视欧美高清免费大片 | 国产精品自拍区| 私拍精品福利视频在线一区| 免费日韩av片| 国产精品久久久久久久久久妞妞 | 色偷偷偷在线视频播放| 美女网站一区| 日韩va亚洲va欧美va久久| 成人在线视频中文字幕| 欧美日韩99| 久久亚州av| 蜜桃av一区二区三区电影| 国产精品毛片久久久| 久久美女精品| a日韩av网址| 日韩av一级片| 宅男在线一区| 国产精品高颜值在线观看| 在线视频精品| 欧美日韩精品免费观看视频完整| 国产精品欧美在线观看| 亚洲一区二区网站| 久久久久国产| 精品一区二区三区中文字幕视频| 国产精品日本一区二区不卡视频| 中文字幕高清在线播放| 日韩一区中文| 久久亚洲国产精品一区二区| 国产在线|日韩| 久久精品亚洲欧美日韩精品中文字幕| 国产欧美一区二区三区国产幕精品 | 91精品国产自产在线丝袜啪| 亚洲婷婷免费| 亚洲成人不卡| 国产精品日本欧美一区二区三区| 日韩黄色大片网站| 麻豆国产精品| 国产精品一区二区三区www| 日韩一区二区三区免费视频| 亚洲乱亚洲高清| 久久最新视频| 视频在线观看国产精品| 美日韩精品视频| 中文无码久久精品| 日韩中文字幕在线一区| 欧美精品中文字幕亚洲专区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩不卡在线| 亚洲福利久久| 黄色亚洲在线| 特黄毛片在线观看| 亚洲日产国产精品| 欧美精品影院| 精品视频黄色| 91免费精品| 欧美一区二区三区高清视频| 99成人超碰| 亚洲精品观看| 亚洲成人二区| 免费观看不卡av| 亚洲久草在线| 国产精品久久久久久久免费软件| 精品久久久中文字幕| 日韩专区欧美专区| 国产精品久久久久久久久久白浆| av在线资源| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩精品亚洲专区在线观看| 国产91欧美| 亚洲精品欧美| 日韩在线高清| 欧美aa在线视频| 欧美香蕉视频| 视频一区二区不卡| 国产激情综合| 国产模特精品视频久久久久| 国产精品多人| 欧美女激情福利| 精品日韩一区| 亚洲精品看片| 亚洲精品中文字幕乱码| 国产精品草草| 石原莉奈一区二区三区在线观看 | 97精品国产| 欧美日韩一区二区高清| 亚洲一区日韩在线| 欧美黄页在线免费观看| 亚洲一区欧美激情| 另类中文字幕国产精品| 牛牛精品成人免费视频| 日韩一区二区三免费高清在线观看| 欧美+日本+国产+在线a∨观看| 免费在线欧美黄色| 日本视频一区二区| 日韩专区在线视频|