日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python教程简书_python教程

發布時間:2023/12/14 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python教程简书_python教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1, 序列化 Serialization

創建一個新環境

在做其他事之前,我們會用virtualenv創建一個新的虛擬環境。這將確保我們的包配置與我們正在工作的其他項目完全隔離。

virtualenv env # 創建虛擬環境,命名: env

source env/bin/activate # 進入虛擬環境env

既然我們已經在虛擬環境中,那么我們就可以安裝我們依賴的包了。

pip install django

pip install djangorestframework

pip install pygments # 代碼高亮插件

開始

首先,我們來創建一個新項目。

cd ~

django-admin.py startproject tutorial

cd tutorial

輸完以上命令,我們就可以創建一個應用,我們將會用他來創建簡單的Web API。

python manage.py startapp snippets

我們會添加一個新的snippets應用和rest_framework應用到INSTALLED_APPS。讓我們編輯tutorial/settings.py文件:

INSTALLED_APPS = (

...

'rest_framework',

'snippets.apps.SnippetsConfig',

)

Ok, 我們準備下一步。

創建一個 Model

為了實現本教程的目的,我們將創建一個簡單的Snippet模型,這個模型用來保存snippets代碼。開始編輯snippets/models.py文件。

from django.db import models

from pygments.lexers import get_all_lexers

from pygments.styles import get_all_styles

LEXERS = [item for item in get_all_lexers() if item[1]]

LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])

STYLE_CHOICES = sorted((item, item) for item in get_all_styles())

class Snippet(models.Model):

created = models.DateTimeField(auto_now_add=True)

title = models.CharField(max_length=100, blank=True, default='')

code = models.TextField()

linenos = models.BooleanField(default=False)

language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)

style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

class Meta:

ordering = ('created',)

我們也需要為我們的snippet模型創建一個初始遷移(initial migration),然后第一次同步數據庫。

python manage.py makemigrations snippets

python manage.py migrate

創建一個序列化類(Serializer class)

著手我們的Web API,首先要做的是,提供一種將我們的snippet實例序列化/反序列化成例如json這樣的表述形式。我們可以通過聲明序列來完成,這些序列與Django的表單(forms)工作相似。在snippets目錄創建一個新文件serializers.py,添加下列代碼。

from rest_framework import serializers

from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES

class SnippetSerializer(serializers.Serializer):

id = serializers.IntegerField(read_only=True)

title = serializers.CharField(required=False, allow_blank=True, max_length=100)

code = serializers.CharField(style={'base_template': 'textarea.html'})

linenos = serializers.BooleanField(required=False)

language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')

style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

def create(self, validated_data):

"""

Create and return a new `Snippet` instance, given the validated data.

"""

return Snippet.objects.create(**validated_data)

def update(self, instance, validated_data):

"""

Update and return an existing `Snippet` instance, given the validated data.

"""

instance.title = validated_data.get('title', instance.title)

instance.code = validated_data.get('code', instance.code)

instance.linenos = validated_data.get('linenos', instance.linenos)

instance.language = validated_data.get('language', instance.language)

instance.style = validated_data.get('style', instance.style)

instance.save()

return instance

序列化類(serializer class)的第一部分定義了一些需要被序列化/反序列化字段。create()和update()方法定義了在調用serializer.save()時成熟的實例是如何被創建和修改的。 序列化類(serializer class)與Django的表單類(Form class)非常相似,包括對各種字段有相似的確認標志(flag),例如required,max_length和default。 在某些情況下,這些字段標志也能控制序列應該怎么表現,例如在將序列渲染成HTML時。{'base_template': 'textarea.html}'標志相當于對Django表單(Form)類使用widget=widgets.Textarea。這對控制API的顯示尤其有用,以后的教程將會看到。 事實上,以后我們可以通過使用ModelSerializer類來節約我們的時間,但是現在為了讓我們序列化定義更清晰,我們用Serializer類。

用序列化(Serializers)工作

在我們深入之前,我們需要熟練使用新的序列化列(Serializer class)。然我們開始使用Django命令行吧。

python manage.py shell

Okay,讓我們寫一些snippets代碼來使序列化工作。

from snippets.models import Snippet

from snippets.serializers import SnippetSerializer

from rest_framework.renderers import JSONRenderer

from rest_framework.parsers import JSONParser

snippet = Snippet(code='foo = "bar"\n')

snippet.save()

snippet = Snippet(code='print "hello, world"\n')

snippet.save()

現在我們已經有了一些snippet實例。讓我們看看如何將其中一個實例序列化。

注: Model -> Serializer

serializer = SnippetSerializer(snippet)

serializer.data

# {'id': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}

現在,我們已經將模型實例(model instance)轉化成Python原生數據類型。為了完成實例化過程,我們要將數據渲染成json。

注: Serializer -> JSON

content = JSONRenderer().render(serializer.data)

content

# '{"id": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}'

反序列化也一樣。首先,我們需要將流(stream)解析成Python原生數據類型...

注: stream -> json

from django.utils.six import BytesIO

stream = BytesIO(content)

data = JSONParser().parse(stream)

...然后我們要將Python原生數據類型恢復成正常的對象實例。

serializer = SnippetSerializer(data=data)

serializer.is_valid()

# True

serializer.validated_data

# OrderedDict([('title', ''), ('code', 'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])

serializer.save()

#

可以看到,API和表單(forms)是多么相似啊。當我們用我們的序列寫視圖的時候,相似性會相當明顯。 除了將模型實例(model instance)序列化外,我們也能序列化查詢集(querysets),只需要添加一個序列化參數many=True。

serializer = SnippetSerializer(Snippet.objects.all(), many=True)

serializer.data

# [OrderedDict([('id', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])]

使用模型序列化ModelSerializers

我們的SnippetSerializer類復制了包含Snippet模型在內的很多信息。如果我們能簡化我們的代碼,那就更好了。 以Django提供表單(Form)類和模型表單(ModelForm)類相同的方式,REST 框架包括了實例化(Serializer)類和模型實例化(ModelSerializer)類。 我們來看看用ModelSerializer類創建的序列。再次打開snippets/serializers.py文件,用下面的代碼重寫SnippetSerializer類。

class SnippetSerializer(serializers.ModelSerializer):

class Meta:

model = Snippet

fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

序列一個非常棒的屬性就是,你能夠通過打印序列實例的結構(representation)查看它的所有字段。輸入python manage.py shell打開命令行,然后嘗試以下代碼:

from snippets.serializers import SnippetSerializer

serializer = SnippetSerializer()

print(repr(serializer))

# SnippetSerializer():

# id = IntegerField(label='ID', read_only=True)

# title = CharField(allow_blank=True, max_length=100, required=False)

# code = CharField(style={'base_template': 'textarea.html'})

# linenos = BooleanField(required=False)

# language = ChoiceField(choices=[('Clipper', 'FoxPro'), ('Cucumber', 'Gherkin'), ('RobotFramework', 'RobotFramework'), ('abap', 'ABAP'), ('ada', 'Ada')...

# style = ChoiceField(choices=[('autumn', 'autumn'), ('borland', 'borland'), ('bw', 'bw'), ('colorful', 'colorful')...

記住,ModelSerializer類并沒有做什么有魔力的事情,它們僅僅是一個創建序列化類的快捷方式。

一個自動決定的字段集合。

簡單的默認create()和update()方法的實現。

用我們的序列化來寫常規的Django視圖

讓我們看看,使用我們新的序列化類,我們怎么寫一些API視圖。此刻,我們不會使用REST框架的其他特性,僅僅像寫常規Django視圖一樣。 通過創建HttpResponse的一個子類來開始,其中,我們可以用這個子類來渲染任何我們返回的json數據。 編輯snippets/views.py文件,添加以下代碼。

from django.http import HttpResponse, JsonResponse

from django.views.decorators.csrf import csrf_exempt

from rest_framework.renderers import JSONRenderer

from rest_framework.parsers import JSONParser

from snippets.models import Snippet

from snippets.serializers import SnippetSerializer

我們的根API將是一個支持列出所有存在的snippets的視圖,或者創建一個新的snippet對象。

@csrf_exempt

def snippet_list(request):

"""

List all code snippets, or create a new snippet.

"""

if request.method == 'GET':

snippets = Snippet.objects.all()

serializer = SnippetSerializer(snippets, many=True)

return JsonResponse(serializer.data, safe=False)

elif request.method == 'POST':

data = JSONParser().parse(request)

serializer = SnippetSerializer(data=data)

if serializer.is_valid():

serializer.save()

return JsonResponse(serializer.data, status=201)

return JsonResponse(serializer.errors, status=400)

注意,因為我們希望可以從沒有CSRF token的客戶端POST數據到這個視圖,我們需要標記這個視圖為csrf_exempt。通常,你并不想這么做,并且事實上REST框架視圖更實用的做法不是這樣的,但是目前來說,這足以到達我們的目的。 我們也需要一個與單個snippet對象相應的視圖,并且我們使用這個視圖來讀取、更新或者刪除這個snippet對象。

@csrf_exempt

def snippet_detail(request, pk):

"""

Retrieve, update or delete a code snippet.

"""

try:

snippet = Snippet.objects.get(pk=pk)

except Snippet.DoesNotExist:

return HttpResponse(status=404)

if request.method == 'GET':

serializer = SnippetSerializer(snippet)

return JsonResponse(serializer.data)

elif request.method == 'PUT':

data = JSONParser().parse(request)

serializer = SnippetSerializer(snippet, data=data)

if serializer.is_valid():

serializer.save()

return JsonResponse(serializer.data)

return JsonResponse(serializer.errors, status=400)

elif request.method == 'DELETE':

snippet.delete()

return HttpResponse(status=204)

最終,我們需要用線將這些視圖連起來。創建snippets/urls.py文件:

from django.conf.urls import url

from snippets import views

urlpatterns = [

url(r'^snippets/$', views.snippet_list),

url(r'^snippets/(?P[0-9]+)/$', views.snippet_detail),

]

我們也需要在根url配置文件tutorial/urls.py中添加我們的snippet應用URL。

from django.conf.urls import url, include

urlpatterns = [

url(r'^', include('snippets.urls')),

]

有一些當時我們沒有正確處理的邊緣事件是沒有價值的。如果我們發送不正確的json數據,或者如果我們制造了一個視圖沒有寫處理的方法(method),那么我們會得到500“服務器錯誤”的響應。當然,現在也會出現這個問題。

測試我們Web API的第一次努力

現在我們開始創建一個測試服務器來服務我們的snippets應用。 退出命令行......

quit()

...然后啟動Django開發服務器。

python manage.py runserver

Validating models...

0 errors found

Django version 1.11, using settings 'tutorial.settings'

Development server is running at http://127.0.0.1:8000/

Quit the server with CONTROL-C.

我們可以在另一個終端測試服務器。 我們可以用curl和httpie來測試我們的API。Httpie是一個面向用戶的非常友好的http客戶端,它是用Python寫的。讓我們來安裝它。 你可以通過pip來安裝httpie:

pip install httpie

最后,我們來獲取一個包含所有snippets的列表:

http http://127.0.0.1:8000/snippets/

HTTP/1.1 200 OK

...

[

{

"id": 1,

"title": "",

"code": "foo = \"bar\"\n",

"linenos": false,

"language": "python",

"style": "friendly"

},

{

"id": 2,

"title": "",

"code": "print \"hello, world\"\n",

"linenos": false,

"language": "python",

"style": "friendly"

}

]

或者我們可以通過id來獲取指定的snippet:

http http://127.0.0.1:8000/snippets/2/

HTTP/1.1 200 OK

...

{

"id": 2,

"title": "",

"code": "print \"hello, world\"\n",

"linenos": false,

"language": "python",

"style": "friendly"

}

相似地,你可以通過在瀏覽器中訪問這些鏈接來獲得相同的json數據。

我們現在在哪

到目前為止,我們做的都很好,我們已經獲得一個序列化API,這和Django的表單API非常相似,并且我們寫好了一些常用的Django視圖。 現在,我們的API視圖除了服務于json外,不會做任何其他特別的東西,并且有一些錯誤我們仍然需要清理,但是它是一個可用的Web API。 我們將會在本教程的第二部分改善這里東西。

2, 請求與響應

從這開始,我們將接觸REST框架的核心。讓我們來介紹一系列必要的搭建模塊。

請求對象

REST框架介紹了一個請求(Request)對象,它擴展了常規的HttpResquest,并且,提供更靈活的請求解析。請求(Request)對象的核心功能是request.data屬性,這個屬性與request.POST相似,但是它對Web APIs更加有用。

request.POST # 只處理表單數據。只對'POST'方法起作用。

request.data # 可以處理任意數據。對'POST','PUT'和'PATCH'方法起作用。

響應對象

REST 框架也介紹了Response對象,它是一類用未渲染內容和內容協商來決定正確的內容類型并把它返回給客戶端的模板響應(TemplateResponse)。

return Response(data) # 根據客戶端的請求來渲染成指定的內容類型。

狀態碼

總是在你的視圖中用數字的HTTP狀態碼會更加容易理解,并且如果你用其他錯誤代碼表示錯誤,就不太容易注意到了。REST框架為每個狀態碼`(status code)`提供更明確的標識符,例如在狀態`(status)`模型中的`HTTP_400_BAD_REQUEST`。用這些標識符代替純數字的HTTP狀態碼是很好的注意。

裝飾API視圖

REST框架提供兩個裝飾器,你可以用它們來寫API視圖。

1 @api_view裝飾器用在基于視圖的方法上。

2 APIView類用在基于視圖的類上。 這些裝飾器提供一些功能,例如確保在你的視圖中接收Request對象,例如在你的Response對象中添加上下文,這樣我們就能實現內容通信。 這里裝飾器也提供了一些行為,例如在合適的時候返回405 Method Not Allowed響應,例如處理任何在訪問錯誤輸入的request.data時出現的解析錯誤(ParseError)異常。

結合在一起

好了,讓我們開始用這些新的組件寫一些視圖。 我們不再需要在我們的視圖(views.py)中使用JSONResponse類,所有現在把它刪掉。一旦我們這樣做了,我們就能很快重建我們的視圖。

from rest_framework import status

from rest_framework.decorators import api_view

from rest_framework.response import Response

from snippets.models import Snippet

from snippets.serializers import SnippetSerializer

@api_view(['GET', 'POST'])

def snippet_list(request):

"""

List all code snippets, or create a new snippet.

"""

if request.method == 'GET':

snippets = Snippet.objects.all()

serializer = SnippetSerializer(snippets, many=True)

return Response(serializer.data)

elif request.method == 'POST':

serializer = SnippetSerializer(data=request.data)

if serializer.is_valid():

serializer.save()

return Response(serializer.data, status=status.HTTP_201_CREATED)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我們的實例視圖是我們之前例子的改良版。簡明了很多,并且目前的代碼和我們使用Forms API很相似。我們也用有意義的狀態碼標識符。 在views.py模塊中,有一個獨立的snippet視圖。

@api_view(['GET', 'PUT', 'DELETE'])

def snippet_detail(request, pk):

"""

Retrieve, update or delete a code snippet.

"""

try:

snippet = Snippet.objects.get(pk=pk)

except Snippet.DoesNotExist:

return Response(status=status.HTTP_404_NOT_FOUND)

if request.method == 'GET':

serializer = SnippetSerializer(snippet)

return Response(serializer.data)

elif request.method == 'PUT':

serializer = SnippetSerializer(snippet, data=request.data)

if serializer.is_valid():

serializer.save()

return Response(serializer.data)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

elif request.method == 'DELETE':

snippet.delete()

return Response(status=status.HTTP_204_NO_CONTENT)

這對我們來說應該非常熟悉,因為它與常規的Django視圖沒有什么區別。 注意,我們不再明確打印我們的對指定內容類型的請求或響應。request.data能夠處理json請求,但是它也能處理其他格式。相似地,雖然我們可以在響應對象中帶數據,但允許REST框架渲染響應成正確的內容類型。

在我們的鏈接(URLs)后添加可選格式后綴

為了利用我們的響應內容不再是單一格式的事實,我們應該為我們的API尾部添加格式后綴。用格式后綴給我們明確參考指定格式的URL,這意味著我們的API能夠處理像http://example.com/api/items/4/.json一樣的鏈接。 在視圖函數中添加一個format參數,像這樣:

def snippet_list(request, format=None):

def snippet_detail(request, pk, format=None):

現在可以很快更新urls.py文件,在已經存在的URL中添加一個格式后綴模式(format_suffix_patterns)。

from django.conf.urls import url

from rest_framework.urlpatterns import format_suffix_patterns

from snippets import views

urlpatterns = [

url(r'^snippets/$', views.snippet_list),

url(r'^snippets/(?P[0-9]+)$', views.snippet_detail),

]

urlpatterns = format_suffix_patterns(urlpatterns)

我們不必添加額外的URL模式,但是它給我們簡單、清楚的方式渲染除特定的格式。

看看吧

和教程第一部分一樣,我們要開始從命令行測試API。雖然我們能在發送無效的請求時更妥當處理錯誤,但是現在一切都做的夠好了。 我們能想之前一樣獲取所有的snippets列表。

http http://127.0.0.1:8000/snippets/

HTTP/1.1 200 OK

...

[

{

"id": 1,

"title": "",

"code": "foo = \"bar\"\n",

"linenos": false,

"language": "python",

"style": "friendly"

},

{

"id": 2,

"title": "",

"code": "print \"hello, world\"\n",

"linenos": false,

"language": "python",

"style": "friendly"

}

]

我們能控制我們返回的響應格式,或者使用Accept響應頭。

http http://127.0.0.1:8000/snippets/ Accept:application/json # Request JSON

http http://127.0.0.1:8000/snippets/ Accept:text/html # Request HTML

或者在URL后添加格式后綴:

http http://127.0.0.1:8000/snippets.json # JSON 后綴

http http://127.0.0.1:8000/snippets.api # 瀏覽用的 API 后綴

同樣地,我們可以控制我們發送的請求格式,用Content-Type請求頭。

# POST using form data

http --form POST http://127.0.0.1:8000/snippets/ code="print 123"

{

"id": 3,

"title": "",

"code": "print 123",

"linenos": false,

"language": "python",

"style": "friendly"

}

# POST using JSON

http --json POST http://127.0.0.1:8000/snippets/ code="print 456"

{

"id": 4,

"title": "",

"code": "print 456",

"linenos": false,

"language": "python",

"style": "friendly"

}

Browsability

因為API是基于客戶端請求來選擇響應內容的類型,所以默認情況下,在Web瀏覽器訪問資源時,API返回HTML格式的資源。這語序API返回完全可以網頁瀏覽的HTML。 有可以網頁瀏覽API是很好的,這使開發和使用你的API更簡單,這也為其他想要查看和使用你的API的開發者大大降低了門檻。 關于可瀏覽API的特性和如何自定義可瀏覽API,請見可瀏覽API話題。

接下來要干什么?

在教程的第三部分,我們基于視圖用類,并且看看普通的視圖我們如何減少代碼。

3, 基于視圖的類(class based view)

除了可以用基于視圖的函數(function based view)寫我們的API,我們也可以用基于視圖的類。正如我們所見,這是一個非常有利的模式,允許我們重用同樣的功能,并幫助我們使代碼緊湊。

用基于視圖的類重寫我們的API

我們將會想重寫一個基于視圖的類一樣重寫根視圖。這包括重構views.py文件。

from snippets.models import Snippet

from snippets.serializers import SnippetSerializer

from django.http import Http404

from rest_framework.views import APIView

from rest_framework.response import Response

from rest_framework import status

class SnippetList(APIView):

"""

List all snippets, or create a new snippet.

"""

def get(self, request, format=None):

snippets = Snippet.objects.all()

serializer = SnippetSerializer(snippets, many=True)

return Response(serializer.data)

def post(self, request, format=None):

serializer = SnippetSerializer(data=request.data)

if serializer.is_valid():

serializer.save()

return Response(serializer.data, status=status.HTTP_201_CREATED)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

到目前為止,一切都很好。這和之前的情況很相似,但是我們已經很好地通過不同的HTTP方法區分。現在我們也需要在views.py中更新實例視圖。

class SnippetDetail(APIView):

"""

Retrieve, update or delete a snippet instance.

"""

def get_object(self, pk):

try:

return Snippet.objects.get(pk=pk)

except Snippet.DoesNotExist:

raise Http404

def get(self, request, pk, format=None):

snippet = self.get_object(pk)

serializer = SnippetSerializer(snippet)

return Response(serializer.data)

def put(self, request, pk, format=None):

snippet = self.get_object(pk)

serializer = SnippetSerializer(snippet, data=request.data)

if serializer.is_valid():

serializer.save()

return Response(serializer.data)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def delete(self, request, pk, format=None):

snippet = self.get_object(pk)

snippet.delete()

return Response(status=status.HTTP_204_NO_CONTENT)

那看起來不錯。再次強調,這和基于視圖的函數非常相似。 我們也需要用基于視圖的類重構我們的urls.py。

from django.conf.urls import url

from rest_framework.urlpatterns import format_suffix_patterns

from snippets import views

urlpatterns = [

url(r'^snippets/$', views.SnippetList.as_view()),

url(r'^snippets/(?P[0-9]+)/$', views.SnippetDetail.as_view()),

]

urlpatterns = format_suffix_patterns(urlpatterns)

好了,我們做完了。如果你啟用開發服務器,那么一切都和之前一樣。

使用混合(mixins)

使用基于視圖的類最大的一個好處是,它允許我們快速創建可復用的行為。我們一直使用的create/retrieve/update/delete操作將和我們創建的任何后端模型API視圖非常相似。這些普遍的行為是通過REST框架的混合類(mixin classes)實現的。 讓我們看看如何通過混合類(mixin classes)組建視圖。下面是我們的views.py模型。

from snippets.models import Snippet

from snippets.serializers import SnippetSerializer

from rest_framework import mixins

from rest_framework import generics

class SnippetList(mixins.ListModelMixin,

mixins.CreateModelMixin,

generics.GenericAPIView):

queryset = Snippet.objects.all()

serializer_class = SnippetSerializer

def get(self, request, *args, **kwargs):

return self.list(request, *args, **kwargs)

def post(self, request, *args, **kwargs):

return self.create(request, *args, **kwargs)

我們會花一會兒準確測試這里發生了什么。我們使用GenericAPIView加上ListMOdelMixin和CreatteModelMixin創建我們的視圖。 基類提供核心功能,混合類提供.list()和.create()動作。然后我們合適的動作綁定明確的get和post方法。到目前為止,東西已經足夠簡單。

class SnippetDetail(mixins.RetrieveModelMixin,

mixins.UpdateModelMixin,

mixins.DestroyModelMixin,

generics.GenericAPIView):

queryset = Snippet.objects.all()

serializer_class = SnippetSerializer

def get(self, request, *args, **kwargs):

return self.retrieve(request, *args, **kwargs)

def put(self, request, *args, **kwargs):

return self.update(request, *args, **kwargs)

def delete(self, request, *args, **kwargs):

return self.destroy(request, *args, **kwargs)

太像了。我們用GenericAPIView類提供核心功能,添加混合(mixin),來提供.retrieve(),.update()和.destroy()動作。

使用基于視圖的一般類(generic class)

盡管我們已經使用混合類(mixin classes)以比之前更少的代碼重寫了視圖,但是我們可以進一步深入。REST框架提供一個已經混入一般視圖的集合,我們能用他們來整理我們的views.py模塊。

from snippets.models import Snippet

from snippets.serializers import SnippetSerializer

from rest_framework import generics

class SnippetList(generics.ListCreateAPIView):

queryset = Snippet.objects.all()

serializer_class = SnippetSerializer

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):

queryset = Snippet.objects.all()

serializer_class = SnippetSerializer

哇,如此簡潔。我們的代碼看起來是如此簡潔、地道的Django。 接下來我們要學習本教程的第四部分,在第四部分我們會為我們的API處理授權(authentication)和權限(permissions)。

4, 授權(Authentication)與權限(Permissions)

當前,我們的API沒有限制誰能編輯或刪除snippets代碼。我們想要一些更高級的行為以確保:

snippets數據總是與創建者聯系在一起。

只有授權用戶才能創建snippets。

只有snippet的創建者才能更新或者刪除它。

沒有授權的請求應該只有只讀權限。

在我們的模型中添加信息

我們打算對我們的Snippet模型類做些改變。首先,讓我們添加幾個字段。其中一個字段將顯示出哪個用戶創建里snippet數據。另一個字段將用于HTML代碼高亮。

將下面兩個字段添加到Snippet模型中,在snippets/models.py中。

owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE)

highlighted = models.TextField()

我們也需要確保當模型保存以后,我們可以看到高亮的字段。為此我們用pygments代碼高亮庫來形成高亮字段。 我們需要一些額外的包:

from pygments.lexers import get_lexer_by_name

from pygments.formatters.html import HtmlFormatter

from pygments import highlight

然后給我們的模型類添加.save()方法:

def save(self, *args, **kwargs):

"""

Use the `pygments` library to create a highlighted HTML

representation of the code snippet.

"""

lexer = get_lexer_by_name(self.language)

linenos = self.linenos and 'table' or False

options = self.title and {'title': self.title} or {}

formatter = HtmlFormatter(style=self.style, linenos=linenos,

full=True, **options)

self.highlighted = highlight(self.code, lexer, formatter)

super(Snippet, self).save(*args, **kwargs)

然后,我們需要更細我們的數據庫表。為此,正常情況下,我們會創建數據庫遷移(database migration),但是就本教程來說,我們只需要刪除原來的數據庫,然后重新創建即可。

rm -f db.sqlite3

rm -r snippets/migrations

python manage.py makemigrations snippets

python manage.py migrate

你可能也想要創建不同的用戶來測試API。最快的方式就是用createsuperuser命令。

python manage.py createsuperuser

為我們的用戶模型添加端點

既然我們已經創建了多個用戶,那么我們最好將用戶添加到我們的API。很容易創建一個新的序列。在serializers.py中添加;

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())

class Meta:

model = User

fields = ('id', 'username', 'snippets')

因為'snippets'在用戶模型中是一個相反的關系,默認情況下在使用ModelSerializer類時我們不會包括,所以我們需要手動為用戶序列添加這個字段。 我們需要添加在views.py中添加一些視圖。我們想要為用戶添加只讀視圖,所以我們會使用基于視圖的一般類ListAPIView和RetrieveAPIView。

from django.contrib.auth.models import User

class UserList(generics.ListAPIView):

queryset = User.objects.all()

serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):

queryset = User.objects.all()

serializer_class = UserSerializer

確保文件中引入了UserSerializer類。

from snippets.serializers import UserSerializer

最后,我們需要通過修改URL配置,將這些視圖添加進API。添加以下urls.py中。

url(r'^users/$', views.UserList.as_view()),

url(r'^users/(?P[0-9]+)/$', views.UserDetail.as_view()),

將用戶和Snippets連接起來

現在,如果我們創建snippet數據,我們沒辦法將用戶和snippet實例聯系起來。雖然用戶不是序列表示的部分,但是它是請求的一個屬性。 我們通過重寫snippet視圖的.perform_create()方法來做到,這個方法允許我們修改如何保存實例,修改任何請求對象或者請求連接里的信息。 在SnippetList視圖類中添加以下方法;

def perform_create(self, serializer):

serializer.save(owner=self.request.user)

現在,我們序列的create()方法將會另外傳入一個來自有效的請求數據的'owner'字段。

更新我們的序列

既然已經將snippets和創建它們的用戶聯系在一起了,那么我們需要更新對應的SnippetSerializer。在serializers.py的序列定義(serializer definition)中添加以下字段:

owner = serializers.ReadOnlyField(source='owner.username')

注意;確保你將'owner'字段添加到內部類Meta的字段列表里。 這個字段很有趣。source參數控制哪個屬性被用于構成一個字段,并且能夠指出序列實例的任何屬性。它也能像上面一樣使用點標記(.),這種情況下他會橫貫給定的屬性,就是我們使用Django模板語言一樣。 我們添加的字段是隱式ReadOnly類,與其他類相反,如CharField,BooleanField,隱式ReadOnlyField總是只讀的,用于序列化表示,但在數據非序列化時不能用于更新實例。這里我們也可以用CharField(read_only=True)。

為視圖添加需要的權限

snippets數據已經和用戶聯系在一起,我們想確保只有授權的用戶可以創建、更新和刪除snippet數據。 REST框架包括許多權限類(permission classes),我們可以使用這些權限類來現在視圖的訪問權限。這種情況下,其中我們需要IsAuthenticatedOrReadOnly,這個類確保授權請求有讀寫權限,而沒有授權的用戶只有只讀權限。 首先,在視圖模塊中引入以下代碼:

from rest_framework import permissions

接下來,將以下屬性添加到SnippetList和SnippetDetail的視圖類中。

permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

為可瀏覽API(Browsable API)添加登錄

如果你打開瀏覽器并瀏覽API,你將會發現你無法再創建新的snippets code,如果想要有創建的權限,需要登錄。

我們可以添加一個登錄視圖,通過編輯我們的根路由urls.py文件。

將下列包導入到文件上方:

from django.conf.urls import include

在文件的末尾,將login和logout的路由配好。

urlpatterns += [

url(r'^api-auth/', include('rest_framework.urls')),

]

url樣式的r'^api-auth/'部分實際上可以是任何你想要的URL。唯一的限制就是include的鏈接必須使用'rest_framework'名字空間。現在如果你刷新瀏覽器頁面,你會看到右上角的'Login'鏈接。如果你用之前創建的用戶登錄,你就可以再次寫snippets數據了。 一旦你創建snippets數據,瀏覽'/users/',然后你會發現在每個用戶的'snippets'字段,顯示的內容包括與每個用戶相關的snippets主鍵。

對象等級權限

雖然我們真的想任何人都和一看見snippets數據,但也要確保只有創建snippet的用戶可以修改或刪除他的snippet。 為此,我們需要創建自定義權限。 在snippets app中,創建一個新文件permissions.py。

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):

"""

Custom permission to only allow owners of an object to edit it.

"""

def has_object_permission(self, request, view, obj):

# Read permissions are allowed to any request,

# so we'll always allow GET, HEAD or OPTIONS requests.

if request.method in permissions.SAFE_METHODS:

return True

# Write permissions are only allowed to the owner of the snippet.

return obj.owner == request.user

然后編輯SnippetDetail視圖類中的permission_classes屬性,添加自定義權限。

permission_classes = (permissions.IsAuthenticatedOrReadOnly,

IsOwnerOrReadOnly,)

確保引入了IsOwnerOrReadOnly類。

from snippets.permissions import IsOwnerOrReadOnly

現在,如果你再次打開瀏覽器,你會發現只有你登入,你才能刪除(DELETE)或更新(PUT)屬于你的snippet數據。

授權API

因為我們的API有一系列權限,所以如果我們想編輯任何snippets,我們需要授權我們的請求。我們現在還沒有任何授權類(authenticaions classes),所以默認情況下只有SessionAuthentication和BasicAuthentication。 當我們通過Web瀏覽器與API交互時,我們可以登錄,然后瀏覽器會話(session)將會提供必須的請求授權。 如果我們通過程序與API交互,我們需要為每個請求提供明確的授權證明。 如果我們在沒有授權的情況下創建一個snippet,那么我們會得到下面的錯誤:

http POST http://127.0.0.1:8000/snippets/ code="print 123"

{

"detail": "Authentication credentials were not provided."

}

為了請求成功,我們需要包含用戶名和密碼。

http -a admin:password123 POST http://127.0.0.1:8000/snippets/ code="print 789"

{

"id": 1,

"owner": "admin",

"title": "foo",

"code": "print 789",

"linenos": false,

"language": "python",

"style": "friendly"

}

總結

現在我們已經在我們的Web API上,為我們的系統用戶和snippet的創建者,添加了很多權限和端點。 在第五部分,我們將會看怎么我們可以通過為我們的高亮snippets創建HTML端點來將所有東西聯系在一起,然后在系統內用超鏈接將我們的API聯系起來。

5, 關系(Relationships)與超鏈接API(Hyperlinked APIs)

現在,用主鍵代表我們API之間的關系。在這部分教程,我們會用超鏈接改善API之間的關系。

為我們的API根創建一個端點

現在,我們已經為'snippets'和'users'設置了端點,但是我們沒有為我們的API設置單獨的入口點。因此,我們會一個基于方法的常規視圖和@api_view裝飾器來創建一個入口點。在你的snippets/views.py中添加:

from rest_framework.decorators import api_view

from rest_framework.response import Response

from rest_framework.reverse import reverse

@api_view(['GET'])

def api_root(request, format=None):

return Response({

'users': reverse('user-list', request=request, format=format),

'snippets': reverse('snippet-list', request=request, format=format)

})

我們會注意到兩件事:第一,我們用了REST框架的reverse方法為了返回高質量的URL;第二,URL格式是方便的名字標識符,我們會在之后會在snippets/urls.py中聲明。

創建一個高亮的snippets端點

另一件明顯的事就是,我們的API缺乏代碼高亮端點。 和我們所有的API端點不一樣,我們不想用JSON,而只是想用HTML顯示。REST框架提供兩種HTML渲染樣式,一種是用模板渲染處理HTML,另一種是用預渲染HTML。第二種是我們想要用的方式。 在創建代碼時,我們需要考慮的是,高亮視圖在我們使用的普通視圖中是不存在的。我們不會返回一個對象實例,而是對象實例的一個屬性。 我們會是使用基類代表實例,并創建我們自己的.get()方法,而不是用普通的視圖。在你的snippets/views.py添加:

from rest_framework import renderers

from rest_framework.response import Response

class SnippetHighlight(generics.GenericAPIView):

queryset = Snippet.objects.all()

renderer_classes = (renderers.StaticHTMLRenderer,)

def get(self, request, *args, **kwargs):

snippet = self.get_object()

return Response(snippet.highlighted)

通常,我們需要添加新的視圖到我們的URL配置。然后,在snippest/urls.py中添加一個鏈接:

url(r'^$', views.api_root),

然后,為高亮snippet添加一個url樣式:

url(r'^snippets/(?P[0-9]+)/highlight/$', views.SnippetHighlight.as_view()),

為我們的API添加超鏈接

處理好實體之間的關系是Web API設計中極具挑戰性的方面之一。代表一種關系可以有很多種方式:

使用主鍵。

在實體之間使用超鏈接。

在相關的實體上使用獨一無二的slug。

使用相關的實體的默認字符串。

在父表述使用嵌套的實體。

一些自定義的表述。

REST框架支持以上所有方式,都能適應正向或者反向關系,或者就行使用一般的外鍵一樣使用自定義的管理方式。

這種情況下,我們想要在實體之間使用超鏈接方式。為了達到目的,我們需要修改我們的序列(serializers),以拓展HyperlinkedModelSerializer,不是使用已經存在的ModelSerializer。

以下是HyperlinkedModelSerializer不同于ModelSerializer的地方:

HyperlinkedModelSerializer默認不包括pk字段。

它只包括一個url字段,使用HyperlinkedIndentityField。

關系使用HyperlinkedRelatedField,而不是PrimaryKeyRelatedField。 我們能使用超鏈接快速重寫現存的序列。在snippets/serializers.py中添加:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):

owner = serializers.ReadOnlyField(source='owner.username')

highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')

class Meta:

model = Snippet

fields = ('url', 'id', 'highlight', 'owner',

'title', 'code', 'linenos', 'language', 'style')

class UserSerializer(serializers.HyperlinkedModelSerializer):

snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True)

class Meta:

model = User

fields = ('url', 'id', 'username', 'snippets')

注意,我們已經添加了一個新字段highlight。這個字段類型是和url一樣的,只是它指向snippet-highlighturl模式,而不是snippet-detailurl模式。 因為我們已經包含了格式后綴的URL,如.json,所以我們也需要在highlight字段指明,任何格式后綴超鏈接應該用.html后綴。

確保我們的URL模式是有名字的

如果我們想要超鏈接的API,那么我們要保證我們給URL起了名字。讓我們看看我們需要命名哪個鏈接。

我們API根指向user-list和snippet-list。

我們的snippet序列包括一個指向snippet-highlight的字段。

我們的用戶血烈包括一個指向snippet-detail的字段。

我們的snippet和用戶序列包括url字段,這個字段默認指向'{model_name}-detail',這種情況下,它是snippet-detail和user-detail。 在將那些名字加入我們的URL配置(URLconf)后,我們的snippets/urls.py應該是下面的樣子:

from django.conf.urls import url, include

from rest_framework.urlpatterns import format_suffix_patterns

from snippets import views

# API endpoints

urlpatterns = format_suffix_patterns([

url(r'^$', views.api_root),

url(r'^snippets/$',

views.SnippetList.as_view(),

name='snippet-list'),

url(r'^snippets/(?P[0-9]+)/$',

views.SnippetDetail.as_view(),

name='snippet-detail'),

url(r'^snippets/(?P[0-9]+)/highlight/$',

views.SnippetHighlight.as_view(),

name='snippet-highlight'),

url(r'^users/$',

views.UserList.as_view(),

name='user-list'),

url(r'^users/(?P[0-9]+)/$',

views.UserDetail.as_view(),

name='user-detail')

])

添加分頁

用戶和snippet的列表視圖會返回很多實例,所以我們想要給這些結果分頁,分頁后允許API客戶端訪問每個單頁。 我們可以用分頁改變默認的列表風格,只要稍微修改tutorial/settings.py文件。添加下面設置:

REST_FRAMEWORK = {

'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',

'PAGE_SIZE': 10

}

注意:REST框架的分頁設置(settings)是一個單獨的字典,叫'REST_FRAMEWORK',它可以幫我們區分項目中的其他配置。 如果我們需要,我們可以自定義分頁樣式,但是現在我們只是用默認的。

瀏覽API

如果我們打開瀏覽器訪問API,那么你會發現你可以通過下面的鏈接使用API。 你也可以看見snippet實例的高亮(highlight)鏈接,這些鏈接會返回高亮HTML代碼。 在本教程的第六部分,我們會用ViewSets和Routers來減少我們API的代碼量。

視圖集(ViewSets)和路由(Routers)

REST框架包括對ViewSets的簡短描述,這可以讓開發者把精力集中在構建狀態和交互的API模型,而且它可以基于一般規范自動構建URL。 ViewSet類幾乎和View類一樣,除了他們提供像read或update的操作,而不是像get和put的方法。 目前,一個ViewSet類只綁定一個方法的集合,當它初始化一個視圖的集合時,一般使用為你處理復雜的URL定義的Router類。

使用視圖集(ViewSets)重構

讓我們來用視圖集重寫當前視圖。 首先,我們要把我們的UserList和UserDetail視圖重寫成單個UserViewSet。我們可以UserViewSet代替UserList和UserDetail。

from rest_framework import viewsets

class UserViewSet(viewsets.ReadOnlyModelViewSet):

"""

This viewset automatically provides `list` and `detail` actions.

"""

queryset = User.objects.all()

serializer_class = UserSerializer

這里我們使用ReadOnlyModelViewSet類自動提供默認的'只讀'操作。黨我們使用常規視圖的時候,我們仍然需要設置準確設置queryset和serializer_class屬性,但是我們不在需要為兩個分開的類提供同樣的信息。 接下來,我們將用SnippetHighlight視圖類來代替SnippetList和SnippetDetail。我們可以用一個類代替之前的三個類。

from rest_framework.decorators import detail_route

from rest_framework.response import Response

class SnippetViewSet(viewsets.ModelViewSet):

"""

This viewset automatically provides `list`, `create`, `retrieve`,

`update` and `destroy` actions.

Additionally we also provide an extra `highlight` action.

"""

queryset = Snippet.objects.all()

serializer_class = SnippetSerializer

permission_classes = (permissions.IsAuthenticatedOrReadOnly,

IsOwnerOrReadOnly,)

@detail_route(renderer_classes=[renderers.StaticHTMLRenderer])

def highlight(self, request, *args, **kwargs):

snippet = self.get_object()

return Response(snippet.highlighted)

def perform_create(self, serializer):

serializer.save(owner=self.request.user)

這次我們使用ModelViewSet類是為了獲得完整的默認讀寫操作的集合。 注意:我們也用了@detail_route裝飾器來創建自定義動作,命名為highlight。這個裝飾器用于添加任何自定義的端點,這些端點不符合標準的create/update/delete方式。 使用@detail_route裝飾器的自定義動作會響應GET請求。如果我們讓動作響應POST請求,我們可以使用methods參數。 自定義動作的URL在默認情況下是依賴于方法本身。如果你想改變url本來創建的方式,你可以將url_path包含在裝飾器關鍵參數中。

明確綁定視圖集到URL

我們定義URLConf的時候,處理方法只綁定了動作。為了看看發生了什么,我們必須從我們的視圖集(ViewSets)創建一個視圖集合。 在urls.py文件中,我們將ViewSet類綁定到具體視圖的集合。

from snippets.views import SnippetViewSet, UserViewSet, api_root

from rest_framework import renderers

snippet_list = SnippetViewSet.as_view({

'get': 'list',

'post': 'create'

})

snippet_detail = SnippetViewSet.as_view({

'get': 'retrieve',

'put': 'update',

'patch': 'partial_update',

'delete': 'destroy'

})

snippet_highlight = SnippetViewSet.as_view({

'get': 'highlight'

}, renderer_classes=[renderers.StaticHTMLRenderer])

user_list = UserViewSet.as_view({

'get': 'list'

})

user_detail = UserViewSet.as_view({

'get': 'retrieve'

})

注意我們如何通過綁定http方法到每個視圖需要的動作來從ViewSet類創建多視圖。 既然我們已經綁定了我們的資源和具體視圖,我們就可以和以前一樣將我們的視圖注冊到URL配置中。

urlpatterns = format_suffix_patterns([

url(r'^$', api_root),

url(r'^snippets/$', snippet_list, name='snippet-list'),

url(r'^snippets/(?P[0-9]+)/$', snippet_detail, name='snippet-detail'),

url(r'^snippets/(?P[0-9]+)/highlight/$', snippet_highlight, name='snippet-highlight'),

url(r'^users/$', user_list, name='user-list'),

url(r'^users/(?P[0-9]+)/$', user_detail, name='user-detail')

])

使用路由

因為我們使用ViewSet類而不是View類,所以實際上我們不需要自己設計URL配置。按慣例,使用Router類就可以自動將資源與視圖(views)、鏈接(urls)聯系起來。我們需要做的只是用一個路由注冊合適的視圖集合。現在,我們把剩下的做完。 我們重寫了urls.py文件。

from django.conf.urls import url, include

from rest_framework.routers import DefaultRouter

from snippets import views

# Create a router and register our viewsets with it.

router = DefaultRouter()

router.register(r'snippets', views.SnippetViewSet)

router.register(r'users', views.UserViewSet)

# The API URLs are now determined automatically by the router.

urlpatterns = [

url(r'^', include(router.urls))

]

用路由注冊視圖和提供一個urlpattern是相似的,包括兩個參數--視圖的URL前綴和視圖本身。 我們使用的默認路由(DefaultRouter)類會自動為我們創建API根視圖,所以我們就可以從我們的views模塊刪除api_root方法。

views和viewsets的比較

使用視圖集(viewsets)真的很有用。它保證URL規范存在你的API中,讓你寫最少的代碼,允許你把注意力集中在你的API提供的交互和表現上而不需要特定的URL配置。 這并不意味著這樣做總是正確的。在使用基于類的視圖代替基于函數的視圖時,我們總會發現views與viewsets有相似的地方。使用視圖集(viewsets)沒有比你自己的視圖更清晰。

回顧

難以置信,用這么少的代碼,我們已經完成了一個Web API,它是完全可瀏覽的,擁有完整的授權(authentication)、每個對象權限(per-object permissions)和多重渲染格式(multiple renderer formats)。 我們已經經歷了設計過程的每一步,看到了如果我們只是使用常規的Django視圖自定義任何東西。

總結

以上是生活随笔為你收集整理的python教程简书_python教程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

97精品一区| 中文字幕免费成人 | 黄色成人小视频 | 欧美福利精品 | 毛片永久免费 | 欧美在线1区 | 波多野结衣视频一区二区 | 久久免费视频国产 | 天堂视频中文在线 | 欧美日韩免费观看一区二区三区 | 欧美成人999 | 精品国产一区二区三区男人吃奶 | 欧女人精69xxxxxx | 激情五月看片 | 精品一区精品二区 | 亚洲精品国产精品久久99 | 国内综合精品午夜久久资源 | 91久久国产综合精品女同国语 | 成人av一区二区兰花在线播放 | 激情图片久久 | 911久久香蕉国产线看观看 | 精品久久久久久久久久久久 | v片在线看| 免费亚洲电影 | 五月天亚洲精品 | 97国产超碰 | 日本色小说视频 | 六月天综合网 | 亚洲欧美综合精品久久成人 | 99看视频在线观看 | 国产一级三级 | 天天色天天综合网 | 精品资源在线 | 久久精彩免费视频 | 亚洲三区在线 | 天天拍天天干 | 在线观看一级视频 | 国产精品地址 | 国产精品欧美一区二区 | 国产视频综合在线 | 国产在线久久久 | 日韩高清不卡在线 | 天天色天 | 亚洲国内精品 | 天天av天天 | 一级片免费在线 | 中文在线8新资源库 | a天堂最新版中文在线地址 久久99久久精品国产 | 99久久一区| 天天射天天操天天干 | 夜夜狠狠 | 91视频麻豆 | 久久看片网站 | 国产精品成人一区二区 | 国产精品久久久毛片 | 好看的国产精品视频 | 91自拍视频在线 | 亚洲视频在线观看网站 | 亚洲成人精品国产 | 国产爽视频 | www.99av| 99精品国产成人一区二区 | 天天色天天骑天天射 | 91免费视频网站在线观看 | 国产精品系列在线观看 | 欧美成人久久 | 欧美午夜精品久久久久 | 日韩黄色在线电影 | 久久久久亚洲精品国产 | 91成熟丰满女人少妇 | 91完整版在线观看 | 久久国产精品99精国产 | 激情深爱.com | 日韩aⅴ视频 | 99在线免费观看视频 | 在线导航福利 | 国产伦精品一区二区三区免费 | 国产精品九色 | 婷婷色中文字幕 | 日本女人逼 | 亚洲午夜精品久久久 | 成人福利在线 | 亚洲精品tv久久久久久久久久 | av天天干 | 在线免费黄色av | 久久国产精品视频免费看 | 色婷婷av一区 | 久久涩涩网站 | 狠狠亚洲 | 最近的中文字幕大全免费版 | www九九热| 久久精品国产亚洲aⅴ | 在线观看日韩av | 国产精品嫩草影院99网站 | 91九色视频在线观看 | 亚洲一区二区三区四区精品 | 久久99热这里只有精品 | 国精产品999国精产品视频 | 欧美专区国产专区 | 婷婷色吧 | 国产精品乱码一区二三区 | 在线观看电影av | jizz18欧美18| 欧美在线观看视频 | 日韩在线观看中文 | 国产日本亚洲高清 | 中文字幕精品一区二区三区电影 | 超碰97公开 | 色五丁香 | 超碰97人人射妻 | 亚洲精品国产综合99久久夜夜嗨 | 中文字幕在线观看视频免费 | 婷五月激情 | 欧美日韩国产免费视频 | 久久精品99国产精品日本 | 日日干,天天干 | 视频福利在线观看 | 97人人添人澡人人爽超碰动图 | 日日爽天天 | 久久伦理网 | 伊人色综合久久天天网 | 日韩在线视频看看 | 日本一区二区高清不卡 | 久久伊人热 | 日韩天堂在线观看 | 在线观看国产福利片 | 天天综合天天做 | 国产免费作爱视频 | 日韩一区二区三区高清免费看看 | 在线观看中文字幕一区 | 日本不卡一区二区三区在线观看 | 国产亚州精品视频 | 免费看色视频 | 婷婷在线五月 | 久久久久中文 | 99精品在线播放 | 综合精品久久久 | 91精品对白一区国产伦 | 欧美粗又大 | 色综合久久久久综合99 | 久草在线资源网 | 天天操操 | 国产无区一区二区三麻豆 | 国产精品视频在线看 | av丝袜在线 | 最新国产精品拍自在线播放 | 亚洲黄a | 国产成人亚洲在线电影 | av 在线观看 | 国产精品一区二区久久精品 | 欧美日韩中字 | 欧美性色综合网 | 91成人精品一区在线播放69 | 欧美日韩首页 | 国产视频一区二区三区在线 | 在线观看视频在线观看 | 亚洲aⅴ在线| 欧美日韩免费在线视频 | 黄色小网站在线观看 | a午夜在线| 亚洲做受高潮欧美裸体 | 国产在线污 | 色婷婷激情电影 | 精品国产欧美一区二区三区不卡 | 精品国产不卡 | 国产黄色资源 | 婷婷亚洲综合 | 福利视频 | 中文字幕欲求不满 | 九九九免费视频 | 99久久日韩精品视频免费在线观看 | 婷婷丁香视频 | 亚洲成人精品在线观看 | 九色激情网 | 九草视频在线观看 | 日韩剧| 99精品视频观看 | www.五月天婷婷.com | 日日夜夜精品网站 | 黄色a在线 | 国产区精品在线 | 在线超碰av | 久久午夜鲁丝片 | 99久久久久久久久久 | 久久www免费人成看片高清 | 日韩精品中文字幕在线观看 | 在线色吧 | 操高跟美女| 久久黄色片子 | 免费黄色小网站 | 亚洲综合情 | 色噜噜在线观看 | 日本护士三级少妇三级999 | 四虎国产精品永久在线国在线 | 欧美日韩午夜爽爽 | 91麻豆精品国产91久久久久 | 黄色一级大片在线免费看国产一 | 国产精品久久久久久模特 | 国产精品久久久久久模特 | 免费视频二区 | 欧美日韩亚洲在线观看 | 日韩网站在线免费观看 | www.色就是色 | 超碰在线公开 | 国产成人一区二区三区免费看 | 天天草夜夜 | 久久久首页 | 亚洲国产精品激情在线观看 | 九草视频在线 | 美女福利视频一区二区 | 国产一级片在线播放 | adc在线观看 | 最近乱久中文字幕 | 91精品国产乱码久久 | 亚洲黄色影院 | 天天综合操 | 国产精品视频一二三 | 亚洲激情久久 | 黄色一级大片在线免费看国产一 | 91在线操 | 成人资源在线观看 | 欧美日韩一区二区三区视频 | 91亚洲国产成人久久精品网站 | 国产精品久久一 | 亚洲成av人电影 | 欧美一区视频 | 日韩在线观看中文 | 精一区二区 | 国产高h视频 | 综合网在线视频 | 99热这里| 天天爽综合网 | 成人手机在线视频 | 狠狠色伊人亚洲综合网站野外 | 正在播放五月婷婷狠狠干 | 欧美 高跟鞋交 xxxxhd | www.亚洲| 久久伦理电影 | 色综合激情网 | 天天躁日日躁狠狠躁av麻豆 | 黄网站免费大全入口 | 亚洲精品国偷拍自产在线观看蜜桃 | 三级视频片 | www.com久久久 | 美女激情影院 | 啪啪资源 | aⅴ精品av导航 | 久久专区 | 国产视频网站在线观看 | 欧美视频在线观看免费网址 | 国产精品久久久区三区天天噜 | 热久久免费国产视频 | 在线看国产精品 | 国产亚洲精品久久久久久无几年桃 | 欧美在线你懂的 | 91亚洲精 | 亚洲成人高清在线 | 国内精品久久久久久久久久久 | 国产不卡在线播放 | 国产99黄| 国产精品久久久久婷婷 | 亚洲日本在线视频观看 | 亚洲国产久 | 久久伊人91 | 日本中文字幕在线一区 | 久久网站av | 国产精品一区二区久久久久 | 一区二区三区日韩在线观看 | 黄色99视频 | 亚洲一级片在线看 | 国产精品一区二区三区电影 | 国产精品2018 | 中文字幕日韩无 | 99久久精品无码一区二区毛片 | 中文字幕精品www乱入免费视频 | 在线黄频 | 欧美精品免费在线 | 国产裸体无遮挡 | 黄色免费网站下载 | 一级欧美黄 | 日韩久久视频 | 欧美日韩不卡一区二区三区 | 久久手机精品视频 | 五月婷婷丁香六月 | 中文字幕在线观看第三页 | 西西44人体做爰大胆视频 | 亚洲成人免费在线 | 亚洲精品免费在线播放 | 亚洲国产精久久久久久久 | 欧美a√在线 | 美国av片在线观看 | 91精品在线观看入口 | 色婷婷av国产精品 | 日本免费久久高清视频 | 亚洲视屏在线播放 | 天天操天天射天天插 | 日韩午夜电影网 | 国产精品欧美日韩 | 日韩黄色在线观看 | av在线免费播放 | 免费久久久久久 | 亚洲va男人天堂 | 婷婷六月在线 | 国产精品1区2区3区在线观看 | 国精产品满18岁在线 | 狠狠干狠狠插 | 日p视频| 欧美一级免费在线 | 免费av大全 | 欧美小视频在线观看 | 国产精品美乳一区二区免费 | 亚洲另类在线视频 | 正在播放一区二区 | 久精品一区 | 特级毛片aaa | 丁香综合网 | 在线亚洲小视频 | 天天综合天天做天天综合 | 中文字幕在线观看不卡 | 91亚洲视频在线观看 | 国产一级电影网 | 国产精品永久在线观看 | 三级黄色网址 | 精品视频专区 | aaawww | 国产精品国产三级国产aⅴ入口 | 精品国产1区 | 青青草国产精品 | 成人av手机在线 | 美女视频一区 | 亚洲男男gaygay无套 | 婷婷亚洲五月色综合 | 久久视频免费看 | 98久9在线 | 免费| 婷婷精品进入 | 国产九色91 | 国内精品久久久久久 | 国产精品久久久久久久久久久免费看 | 久久久久久伊人 | 国产一区二区三区在线免费观看 | a级片网站| 伊人五月| 久热超碰| 日韩电影在线观看一区二区三区 | 免费在线观看a v | 日本精品免费看 | 亚洲精品美女视频 | 一级黄色片在线免费看 | 91av视频播放 | 81国产精品久久久久久久久久 | 97av视频 | 国产中文字幕大全 | 天天干天天做天天爱 | 不卡中文字幕av | 麻豆mv在线观看 | 欧美一级专区免费大片 | 亚洲精品国产精品乱码在线观看 | 久久老司机精品视频 | 亚洲手机天堂 | 亚洲国产视频在线 | 国产在线观看你懂得 | 黄色软件在线观看 | 综合天堂av久久久久久久 | 天天视频色| 亚洲精品一区中文字幕乱码 | 97视频在线观看免费 | 亚洲精品视频网址 | 在线观看免费一级片 | 久久久久久久久久久久亚洲 | 98久久| 亚洲在线日韩 | 尤物九九久久国产精品的分类 | 人人爽人人爽人人爽人人爽 | 麻豆视频在线免费 | 91热这里只有精品 | 国产欧美最新羞羞视频在线观看 | 全黄色一级片 | 这里只有精品视频在线观看 | 精品自拍av | 精品视频在线播放 | 欧美亚洲xxx | 草久在线观看 | av在线一二三区 | 亚洲在线精品 | 中文字幕av播放 | 久久久久亚洲精品成人网小说 | 亚洲最新视频在线播放 | 国产在线观看国语版免费 | 日本久久成人中文字幕电影 | 国产精品一区二区免费视频 | 婷婷新五月 | 九九免费在线观看视频 | 97品白浆高清久久久久久 | 精品国产免费观看 | 亚洲激情电影在线 | 99热 精品在线 | 免费观看版 | 国产精品毛片一区二区在线 | 成年人在线观看 | 91精品国产综合久久久久久久 | 欧美日韩国产精品一区二区亚洲 | 国产在线中文字幕 | 精品一区二区三区四区在线 | 成人一区二区三区中文字幕 | 狠狠的日 | 国产资源精品 | 日韩av片无码一区二区不卡电影 | 精品久久久久一区二区国产 | 国产精品国产三级国产aⅴ无密码 | 91精品在线免费视频 | 天天干夜夜夜操天 | 国产精品美女www爽爽爽视频 | 亚洲国产精品va在线看黑人 | 国产九九在线 | 超碰97网站| 久操中文字幕在线观看 | 日韩在线免费高清视频 | 视频在线在亚洲 | www一起操 | 国产一二区精品 | 中文成人字幕 | 美国人与动物xxxx | 亚洲午夜久久久久久久久电影网 | 狠狠干婷婷色 | 三级性生活视频 | 美女av在线免费 | 成人在线视频在线观看 | 狠狠躁天天躁综合网 | 国产精品青青 | 黄色特级毛片 | 天天爽夜夜爽精品视频婷婷 | 亚洲黄色免费在线 | 精品国产一区二区在线 | 国产日产精品久久久久快鸭 | 亚洲成aⅴ人片久久青草影院 | 99久久激情 | 丁香六月在线 | 久久av网址 | 黄色小网站在线 | 狠狠的操狠狠的干 | 国产精品6999成人免费视频 | 国产做aⅴ在线视频播放 | 国产精品伦一区二区三区视频 | 欧美国产三区 | 日韩精品综合在线 | 色伊人网 | 国产精品久久久久永久免费 | 亚洲涩涩一区 | 久久久精品视频成人 | 日本久久中文字幕 | 亚洲国产精品成人综合 | 亚色视频在线观看 | 中日韩三级视频 | 色网址99 | 国产精品第一页在线观看 | 在线国产一区二区三区 | 色吊丝在线永久观看最新版本 | 人人干狠狠操 | 国产亚洲在线观看 | 天天综合网国产 | 亚洲激精日韩激精欧美精品 | 国产专区在线视频 | 中文字幕在线视频第一页 | 在线观看视频亚洲 | 又黄又爽的视频在线观看网站 | 色综合久久五月 | 91完整版在线观看 | 成人国产电影在线观看 | 福利在线看片 | 久久久久国产a免费观看rela | 成人欧美一区二区三区在线观看 | 日韩视频免费观看高清完整版在线 | 日韩高清在线一区 | 中文字幕在线观看免费高清电影 | 99热超碰 | 国产精品一区二区久久精品爱微奶 | 日韩视频中文字幕 | 中文字幕在线视频一区二区三区 | 久久精品91视频 | 免费在线观看成人 | 久草资源在线观看 | 国产精品一区二区av | 天天摸天天舔天天操 | 国产中文在线观看 | 天天天天爽 | 在线观看精品视频 | 欧美一区免费在线观看 | 怡红院av久久久久久久 | 免费黄色在线网址 | 99这里有精品 | 一级黄色片在线 | 久久夜夜爽| 在线网站黄 | 久久免费播放视频 | 国产一区高清在线 | 六月丁香社区 | 蜜臀久久99静品久久久久久 | 人人爽人人澡人人添人人人人 | 看全黄大色黄大片 | 成人四虎 | 日韩在线一级 | 久草在线免费看视频 | 亚洲最大成人免费网站 | 国产一区二区在线免费播放 | 欧美视频在线观看免费网址 | 干天天| 日韩在线第一 | 又黄又网站 | 成人在线免费视频观看 | 在线观看国产一区二区 | 欧美日韩国产色综合一二三四 | 国产高清无线码2021 | 免费精品视频在线 | 国产日产欧美在线观看 | 国内精品久久久久国产 | 成人久久久久 | 91亚色免费视频 | avcom在线| 免费国产ww | 精品视频在线看 | 国产亚洲久一区二区 | 免费精品在线观看 | 亚洲最大免费成人网 | 五月婷婷激情综合 | 婷婷色视频 | 精品专区一区二区 | 激情五月色播五月 | av网址aaa | 午夜av免费观看 | 成人av电影免费观看 | 久久久久国产a免费观看rela | 黄色1级毛片 | 色视频网站免费观看 | 人人看人人爱 | 爱av在线网| x99av成人免费 | 97在线成人 | 国产黄色看片 | 中文日韩在线 | 国产精品久久久久一区二区三区 | 国产一级视频 | 色综合天天射 | av中文在线影视 | 超碰免费久久 | 99国产精品视频免费观看一公开 | 五月天激情在线 | 亚洲激情 在线 | 国产美女在线免费观看 | 国产亚洲精品久久久久久电影 | 国产区精品视频 | 日韩欧美一区二区三区在线 | 五月婷婷中文网 | 手机成人在线电影 | 97视频在线播放 | 夜夜躁狠狠躁日日躁视频黑人 | 在线免费av电影 | 免费观看av网站 | 亚洲电影在线看 | 81国产精品久久久久久久久久 | 欧美一级特黄aaaaaa大片在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 久久久久激情视频 | 久久久久久久18 | 久久免费视频在线观看 | 成人免费在线看片 | 91人人爽人人爽人人精88v | 粉嫩高清一区二区三区 | 亚洲 欧美 变态 国产 另类 | 亚洲传媒在线 | 麻豆传媒视频在线免费观看 | 亚州欧美精品 | 国产资源网站 | 日日夜夜精品视频天天综合网 | 99精品偷拍视频一区二区三区 | 亚洲一区二区三区精品在线观看 | 亚洲国产欧美在线看片xxoo | 91av在| 超碰个人在线 | 国产精品久久二区 | 日韩高清免费电影 | 免费欧美精品 | 天天草夜夜 | 色天天 | 在线免费视频 你懂得 | 国产成人一区二区三区在线观看 | av在线亚洲天堂 | 国产一级片免费视频 | 国产成视频在线观看 | 中文字幕精品一区二区三区电影 | 亚洲综合网站在线观看 | 久久少妇| 99精品视频观看 | 免费观看十分钟 | 久久免费美女视频 | 国产精品福利视频 | 免费看国产曰批40分钟 | 在线 国产 日韩 | 在线免费观看视频a | 久久久久久久久久久综合 | 亚洲黄色免费观看 | 色婷婷综合成人av | 亚洲免费在线视频 | 黄色亚洲精品 | 精品一区二区三区在线播放 | 国产中文字幕亚洲 | 美女网站在线看 | 色视频网页 | 久久久国产精品一区二区三区 | 亚洲精品伦理在线 | 久久久精品国产免费观看一区二区 | 亚洲资源 | 成人a在线观看高清电影 | 狠狠色伊人亚洲综合网站野外 | 久久五月天色综合 | 欧美日韩中文字幕综合视频 | 蜜臀av夜夜澡人人爽人人 | 亚洲国产精品人久久电影 | 亚洲午夜久久久久久久久 | 黄在线| 永久免费观看视频 | 精品久久久久久久久久久久 | 色综合www | 欧美日韩一区久久 | 久久夜夜爽 | av在线播放亚洲 | 国产精品一区二区三区在线看 | 五月婷婷久草 | 国产 日韩 在线 亚洲 字幕 中文 | 一级黄色片毛片 | 久久国产精品免费视频 | 97国产大学生情侣酒店的特点 | www.eeuss影院av撸| 欧美日韩一区二区三区在线免费观看 | 久草在线视频资源 | av不卡免费在线观看 | 中文字幕在线观看网址 | 四虎在线观看视频 | 亚洲欧美国产精品18p | 久久久久国产一区二区三区 | 欧美精品久久久久久久久免 | 免费在线一区二区三区 | 中文字幕在线观看播放 | 人人搞人人爽 | 国产成人精品久久亚洲高清不卡 | 色视频网站在线观看一=区 a视频免费在线观看 | www.91国产| 婷婷视频在线 | 久久免费播放 | 日韩精选在线观看 | 91视频一8mav | 久99久久| 欧美国产日韩在线视频 | 在线看成人 | 99视频在线看 | 色播六月天 | 中文字幕美女免费在线 | 久久综合国产伦精品免费 | 最近免费中文字幕 | 欧美一区成人 | 久久综合九色综合网站 | 日韩网站免费观看 | 久久国产二区 | 最新91在线视频 | 国产精品成人免费一区久久羞羞 | 天天射天天爽 | 久久精品123| 亚洲撸撸 | 亚洲性少妇性猛交wwww乱大交 | 欧美成年黄网站色视频 | 天天干天天天天 | 丁香在线视频 | 亚洲永久精品国产 | 国产无遮挡又黄又爽在线观看 | 人人看人人草 | 99热精品免费观看 | 成人亚洲精品久久久久 | 五月婷在线 | 免费观看一区二区 | 久久精品视频一 | 久久久亚洲国产精品麻豆综合天堂 | 色999在线 | 久久成人精品电影 | 免费大片av | 久久久久久久看片 | 国产精品久久久久久久久久久久冷 | 丁香高清视频在线看看 | 在线播放国产一区二区三区 | 精品久久久久一区二区国产 | 99综合影院在线 | 成片免费观看视频999 | 黄色亚洲精品 | av高清在线 | 日韩久久午夜一级啪啪 | 久久专区| 国产精品久久久久久久久毛片 | 99精品国产在热久久 | 亚洲欧美色婷婷 | 日韩免费观看av | 日日干av| 91日韩在线专区 | 亚洲午夜久久久综合37日本 | 日韩精品极品视频 | 又粗又长又大又爽又黄少妇毛片 | 综合国产在线 | 特级黄色片免费看 | 又黄又爽又刺激视频 | 成人免费网站视频 | 视频一区视频二区在线观看 | 99综合久久| 丰满少妇麻豆av | 亚洲九九爱| 日韩黄色免费在线观看 | 国产中文字幕网 | 成年人国产精品 | 综合网中文字幕 | av在线电影免费观看 | 国产精品区免费视频 | 亚洲伊人天堂 | 久久伦理视频 | 西西4444www大胆视频 | 欧美日韩在线播放一区 | 91九色在线观看视频 | 欧美韩国日本在线观看 | 国产亚洲婷婷 | 色大片免费看 | 91网在线 | av一本久道久久波多野结衣 | 91精品国产91热久久久做人人 | 手机在线小视频 | 亚洲精品999 | 天天艹天天操 | 91久久在线观看 | 激情大尺度视频 | 久久97视频| 日韩电影在线视频 | 天天射一射 | 成人毛片一区 | 网站在线观看日韩 | 色午夜影院 | 国产精品一区二区三区免费看 | 在线免费视频 你懂得 | av手机版| 麻豆播放| 黄色亚洲在线 | 夜色资源站国产www在线视频 | 日日干日日色 | 久草青青在线观看 | 国产视频2 | 国产在线观看99 | 五月婷婷色综合 | 在线观看视频一区二区三区 | 国产小视频在线观看免费 | 久热国产视频 | 国产精品综合久久久久久 | 在线观看亚洲精品 | 国产精华国产精品 | 久草在线视频在线 | 亚洲涩涩网 | 亚洲国产精品激情在线观看 | 欧美激情视频一区 | 成人午夜电影网站 | 亚洲精品在线一区二区 | 亚洲成aⅴ人在线观看 | 日日操日日 | 伊人五月天综合 | 成人午夜精品福利免费 | av中文在线 | 91香蕉视频色版 | 欧美一区二区三区在线播放 | 亚洲精品网站 | 人人艹视频 | 久久免费视频播放 | 欧美另类交在线观看 | 曰本免费av | 99精品久久99久久久久 | 精品国内自产拍在线观看视频 | 久久激情小视频 | 亚洲成人黄色在线 | www.黄色小说.com| 国产黄色一级片在线 | 日韩激情一二三区 | 国产免费视频一区二区裸体 | 五月天天在线 | 国产一级a毛片视频爆浆 | av片中文| 国产日韩欧美在线免费观看 | 天天综合天天做天天综合 | 九色自拍视频 | 91福利视频网站 | 成人av直播 | 亚洲va欧美va人人爽 | 国产成人精品一区二区三区网站观看 | 日韩91精品| 日一日操一操 | 日韩在线| 亚洲va欧美va | 91视频久久久 | 91久久丝袜国产露脸动漫 | 插插插色综合 | 欧美精品久久久久久久久久 | 色吊丝在线永久观看最新版本 | 超碰人人99| 亚洲日本va中文字幕 | 久综合网 | 国产亚洲精品久久久久久久久久久久 | 91亚洲欧美| 日本中文字幕观看 | 色在线视频 | 97视频在线观看免费 | av视屏在线| 久久国产精品久久w女人spa | 久久九九影院 | 国产亚洲精品久久久久久 | 色黄久久久久久 | 亚洲一区二区视频在线 | 欧美一级片播放 | 五月天婷婷狠狠 | 国产成人三级在线 | 国产精品国产三级国产aⅴ无密码 | 69精品久久 | 日韩理论片在线观看 | 日本中文字幕网站 | 欧美日韩啪啪 | 亚洲精品xxxx | 久久国产美女 | 天海冀一区二区三区 | 国产视频2 | 91夜夜夜 | 97超碰人人网 | 黄色一级大片在线免费看国产一 | 久久综合久久综合这里只有精品 | 国产成人777777 | 久久撸在线视频 | 99精品在线播放 | av成人免费网站 | 国产成人一区二区三区在线观看 | 精品欧美一区二区三区久久久 | 日韩欧美国产成人 | 视频在线观看国产 | 欧美成人理伦片 | 91亚洲国产成人 | 午夜国产一区二区三区四区 | 九九综合九九 | 成人免费看电影 | 日韩精品在线视频 | 69视频国产 | 美女网站黄免费 | 高清不卡一区二区三区 | 9在线观看免费 | 国产在线黄色 | 超碰在线1 | 天天摸天天操天天舔 | 亚洲精品国产日韩 | 国产精品久久久一区二区三区网站 | 在线看国产视频 | 激情片av | 亚洲2019精品 | 91免费视频网站在线观看 | 亚洲在线不卡 | 激情综合啪 | 国内精品久久久久久 | 精品久久国产 | 国产激情久久久 | 国产美女被啪进深处喷白浆视频 | 国产黄在线看 | 天天曰天天射 | 成人一区在线观看 | 国产成人精品女人久久久 | 国产精品第一页在线观看 | 欧美无极色| 国产在线精品视频 | 日日爱网址 | 国产在线高清精品 | 永久av免费在线观看 | 婷婷六月在线 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 久久在线免费观看视频 | 久久99热这里只有精品 | 久久最新| 成人影片在线播放 | 国产精品一区二区三区在线看 | 久久精品中文字幕 | a级一a一级在线观看 | 91看片淫黄大片一级在线观看 | 国产夫妻性生活自拍 | 中文字幕有码在线 | 天天干天天天 | 精品久久久免费 | 操操操影院 | 成人国产精品入口 | 天天操综 | 国产精品av在线免费观看 | 伊人亚洲综合 | 99久久精品国产系列 | 最新免费av在线 | 97超碰超碰久久福利超碰 | 天天色天天综合网 | 蜜桃麻豆www久久囤产精品 | 亚洲黄网站 | 国产黑丝一区二区三区 | 国产精品九九久久久久久久 | 国产一区网 | 99久久精品久久久久久动态片 | 国产亚洲资源 | 国产69久久精品成人看 | 免费h视频 | 国产亚洲精品成人av久久影院 | 在线一级片 | 又长又大又黑又粗欧美 | 97超碰资源 | 91麻豆精品国产91久久久无需广告 | 中文字幕成人在线 | 亚洲欧美国产精品久久久久 | 久久久久久久久毛片精品 | 999久久久免费视频 午夜国产在线观看 | 亚洲国产精品视频 | 天天操天天射天天舔 | 精品国产一区二区三区四 | 日日夜夜天天 | 69亚洲精品| 香蕉视频亚洲 | 久久九九久久 | 狠狠色狠狠色综合日日92 | 国产精品自拍av | 亚洲高清av | 国产精品一区二区久久精品爱微奶 | 天天操天天射天天插 | 亚洲婷婷伊人 | 婷婷丁香在线视频 | 免费网址在线播放 | 中文字幕亚洲高清 | 国产在线精 | 91亚洲精 | 免费在线中文字幕 | 在线观看精品黄av片免费 | 亚洲在线日韩 | 色狠狠久久av五月综合 | 成人av网址大全 | 一区中文字幕在线观看 | 国产精品女同一区二区三区久久夜 | 国产97色 | 一区二区影视 | 日韩av区 | 久久专区| 免费a网 | 超级碰碰免费视频 | av福利免费 | 国内精品美女在线观看 | 在线看一级片 | 久久精品99国产精品酒店日本 | 成 人 黄 色 免费播放 | 亚洲电影影音先锋 | 国产一级免费片 | 国产精品久久久久久久久久久久冷 | 成年人av在线播放 | 久久免费视屏 | 国产精品99久久久 | 美女网站视频久久 | 97超碰人人澡人人爱 | 久草在线视频精品 | 免费观看性生活大片 | 久久婷婷激情 | 欧美性色网站 | 国产欧美精品一区二区三区 | 操操操干干干 | 97爱爱爱 | 91三级在线观看 | 国产九色在线播放九色 | 玖玖爱在线观看 | 日韩电影在线观看中文字幕 | 五月天激情视频在线观看 | 中文字幕有码在线观看 | 国产在线小视频 | 欧美成人性战久久 | av一区在线播放 | 国精产品满18岁在线 | 中文字幕在线网址 | 亚洲一区免费在线 | 午夜18视频在线观看 | 8x成人免费视频 | 亚洲国产大片 | 精品久久中文 | 国产日韩精品一区二区在线观看播放 | 欧美看片 | 久久久久一区 | 亚洲免费在线观看视频 | av中文国产 | 五月婷婷网站 | 天天天天射 | 国产精品久久久久久久久久白浆 | 国产精品日韩在线播放 | 国产色视频网站2 | 日韩一二三 | 在线免费中文字幕 | 免费在线观看成年人视频 | 久久精品女人毛片国产 | 99热99re6国产在线播放 | 99久久视频|