成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > Django自定義User模型、認(rèn)證、權(quán)限控制的操作

Django自定義User模型、認(rèn)證、權(quán)限控制的操作

熱門標(biāo)簽:蓋州市地圖標(biāo)注 地圖標(biāo)注微信發(fā)送位置不顯示 地圖標(biāo)注的意義點(diǎn) 地圖制圖標(biāo)注位置改變是移位嗎 上海機(jī)器人外呼系統(tǒng)哪家好 315電話機(jī)器人廣告 房產(chǎn)電銷外呼系統(tǒng) 南京銷售外呼系統(tǒng)軟件 浙江電銷卡外呼系統(tǒng)好用嗎

Django自帶強(qiáng)大的User系統(tǒng),為我們提供用戶認(rèn)證、權(quán)限、組等一系列功能,可以快速建立一個(gè)完整的后臺(tái)功能。

但User模型并不能滿足我們的需求,例如自帶的User表中沒(méi)有手機(jī)號(hào)碼,而且對(duì)于國(guó)人來(lái)說(shuō)表中的first_name和last_name并沒(méi)有什么卵用,對(duì)于實(shí)際生產(chǎn)中靈活的用戶表來(lái)說(shuō)重寫User模型是非常有必要的。

擴(kuò)展User模型

擴(kuò)展User模型有許多的方法:

1、Proxy繼承:

代理繼承,此方法只能夠繼承User本身?yè)碛械淖侄?,并不能夠添加和刪改,不會(huì)影響表中原有的結(jié)構(gòu),但是可以定義一些方法來(lái)獲取我們需要的數(shù)據(jù):

from django.contrib.auth.models import User
class ProxyUser(User):
    class Meta:
        proxy = True # 定義代理模型
    def get_data(self):
        return self.objects.filter("過(guò)濾條件")

2、一對(duì)一外鍵:

如果我們對(duì)User本身的字段和驗(yàn)證方法沒(méi)有要求,只是想要增加額外字段,可以通過(guò)創(chuàng)建另外一張表去關(guān)聯(lián)User表,從而添加額外字段,并且我們可以寫一個(gè)接受保存模型的信號(hào)處理方法,只要User調(diào)用了save方法,那么關(guān)聯(lián)表就會(huì)自動(dòng)添加一條數(shù)據(jù)與User新添加的用戶進(jìn)行綁定:

from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver # 導(dǎo)入receiver監(jiān)聽(tīng)信號(hào)
from django.db.models.signals import post_save # 導(dǎo)入post_save信號(hào)
class ExtensionUser(object):
    """創(chuàng)建一對(duì)一模型,并添加新的字段"""
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    telephone = models.CharField(max_length=11,verbose_name="手機(jī)號(hào)碼")
@receiver(post_save,sender=User) # 監(jiān)聽(tīng)到post_save事件且發(fā)送者是User則執(zhí)行create_extension_user函數(shù)
def create_extension_user(sender,instance,created,**kwargs):
    """
    sender:發(fā)送者
    instance:save對(duì)象
    created:是否是創(chuàng)建數(shù)據(jù)
    """
    if created: 
        # 如果創(chuàng)建對(duì)象,ExtensionUser進(jìn)行綁定
        ExtensionUser.objects.create(user=instance)
    else:
        # 如果不是創(chuàng)建對(duì)象,同樣將改變進(jìn)行保存
        instance.extension.save()

3、繼承AbstractUser自定義模型:

Django自帶的User模型就是繼承的AbstractUser類,因此我們可以通過(guò)繼承AbractUser類自定義User模型:

from django.contrib.auth.models import BaseUserManager,AbstractUser
from shortuuidfield import ShortUUIDField # 使用shortuuid作為User表的主鍵,使數(shù)據(jù)更加的安全
class UserManager(BaseUserManager): #自定義Manager管理器
    def _create_user(self,username,password,email,**kwargs):
        if not username:
            raise ValueError("請(qǐng)傳入用戶名!")
        if not password:
            raise ValueError("請(qǐng)傳入密碼!")
        if not email:
            raise ValueError("請(qǐng)傳入郵箱地址!")
        user = self.model(username=username,email=email,**kwargs)
        user.set_password(password)
        user.save()
        return user
    def create_user(self,username,password,email,**kwargs): # 創(chuàng)建普通用戶
        kwargs['is_superuser'] = False
        return self._create_user(username,password,email,**kwargs)
    def create_superuser(self,username,password,email,**kwargs): # 創(chuàng)建超級(jí)用戶
        kwargs['is_superuser'] = True
        kwargs['is_staff'] = True
        return self._create_user(username,password,email,**kwargs)
class User(AbstractUser): # 自定義User
    GENDER_TYPE = (
        ("1","男"),
        ("2","女")
    )
    uid = ShortUUIDField(primary_key=True)
    username = models.CharField(max_length=15,verbose_name="用戶名",unique=True)
    nickname = models.CharField(max_length=13,verbose_name="昵稱",null=True,blank=True)
    age = models.IntegerField(verbose_name="年齡",null=True,blank=True)
    gender = models.CharField(max_length=2,choices=GENDER_TYPE,verbose_name="性別",null=True,blank=True)
    phone = models.CharField(max_length=11,null=True,blank=True,verbose_name="手機(jī)號(hào)碼")
    email = models.EmailField(verbose_name="郵箱")
    picture = models.ImageField(upload_to="Store/user_picture",verbose_name="用戶頭像",null=True,blank=True)
    home_address = models.CharField(max_length=100,null=True,blank=True,verbose_name="地址")
    card_id = models.CharField(max_length=30,verbose_name="身份證",null=True,blank=True)
    is_active = models.BooleanField(default=True,verbose_name="激活狀態(tài)")
    is_staff = models.BooleanField(default=True,verbose_name="是否是員工")
    date_joined = models.DateTimeField(auto_now_add=True)
    USERNAME_FIELD = 'username' # 使用authenticate驗(yàn)證時(shí)使用的驗(yàn)證字段,可以換成其他字段,但驗(yàn)證字段必須是唯一的,即設(shè)置了unique=True
    REQUIRED_FIELDS = ['email'] # 創(chuàng)建用戶時(shí)必須填寫的字段,除了該列表里的字段還包括password字段以及USERNAME_FIELD中的字段
    EMAIL_FIELD = 'email' # 發(fā)送郵件時(shí)使用的字段
    objects = UserManager()
    def get_full_name(self):
        return self.username
    def get_short_name(self):
        return self.username
    class Meta:
        verbose_name = "用戶"
        verbose_name_plural = verbose_name

自定義好User模型之后還需要在settings中設(shè)置系統(tǒng)才會(huì)識(shí)別當(dāng)前User模型作為系統(tǒng)默認(rèn)User模型,settings中需要先安裝app,然后添加AUTH_USER_MODEL=‘a(chǎn)pp.User':

 

之后重新python manage.py makemigrations,python manage.py migrate就可以使用該模型作為系統(tǒng)User模型了。

4、繼承AbstractBaseUser類、PermissionsMixin類自定義User模型:

繼承AbstracUser類自定義User有一個(gè)不好的地方,就是我們沒(méi)有辦法改變其已有的字段,比如first_name和last_name我們并不需要,這個(gè)時(shí)候就可以繼承AbstractBaseUser和PermissionsMixin類完全重寫User模型:

from django.contrib.auth.models import AbstractBaseUser,PermissionsMixin,BaseUserManager
from shortuuidfield import ShortUUIDField
from django.db import models
class UserManager(BaseUserManager):
    def _create_user(self,username,password,email,**kwargs):
        if not username:
            raise ValueError("請(qǐng)傳入用戶名!")
        if not password:
            raise ValueError("請(qǐng)傳入密碼!")
        if not email:
            raise ValueError("請(qǐng)傳入郵箱地址!")
        user = self.model(username=username,email=email,**kwargs)
        user.set_password(password)
        user.save()
        return user
    def create_user(self,username,password,email,**kwargs):
        kwargs['is_superuser'] = False
        return self._create_user(username,password,email,**kwargs)
    def create_superuser(self,username,password,email,**kwargs):
        kwargs['is_superuser'] = True
        kwargs['is_staff'] = True
        return self._create_user(username,password,email,**kwargs)
class User(AbstractBaseUser,PermissionsMixin): # 繼承AbstractBaseUser,PermissionsMixin
    GENDER_TYPE = (
        ("1","男"),
        ("2","女")
    )
    uid = ShortUUIDField(primary_key=True)
    username = models.CharField(max_length=15,verbose_name="用戶名",unique=True)
    nickname = models.CharField(max_length=13,verbose_name="昵稱",null=True,blank=True)
    age = models.IntegerField(verbose_name="年齡",null=True,blank=True)
    gender = models.CharField(max_length=2,choices=GENDER_TYPE,verbose_name="性別",null=True,blank=True)
    phone = models.CharField(max_length=11,null=True,blank=True,verbose_name="手機(jī)號(hào)碼")
    email = models.EmailField(verbose_name="郵箱")
    picture = models.ImageField(upload_to="Store/user_picture",verbose_name="用戶頭像",null=True,blank=True)
    home_address = models.CharField(max_length=100,null=True,blank=True,verbose_name="地址")
    card_id = models.CharField(max_length=30,verbose_name="身份證",null=True,blank=True)
    is_active = models.BooleanField(default=True,verbose_name="激活狀態(tài)")
    is_staff = models.BooleanField(default=True,verbose_name="是否是員工")
    date_joined = models.DateTimeField(auto_now_add=True)
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']
    EMAIL_FIELD = 'email'
    objects = UserManager()
    def get_full_name(self):
        return self.username
    def get_short_name(self):
        return self.username
    class Meta:
        verbose_name = "用戶"
        verbose_name_plural = verbose_name

此時(shí)數(shù)據(jù)庫(kù)中只會(huì)生成我們定義好的字段。

定義好了User模型我們就可以使用Django自帶的登錄驗(yàn)證和權(quán)限系統(tǒng)了。

首先注冊(cè)功能:

form.py

from django.forms import Form
from django.forms import fields
from django.core.exceptions import ValidationError
class RegisterForm(Form):
    username = fields.CharField(
        required=True,
        min_length=3,
        max_length=18,
        error_messages={
            "required":"用戶名不可以為空!",
            "min_length":"用戶名不能低于3位!",
            "max_length":"用戶名不能超過(guò)18位!"
        }
    )
    password1 = fields.CharField(
        required=True,
        min_length=3,
        max_length=18,
        error_messages={
            "required":"密碼不可以空",
            "min_length": "密碼不能低于3位!",
            "max_length": "密碼不能超過(guò)18位!"
        }
    )
    password2 = fields.CharField(required=False)
    email = fields.EmailField(
        required=True,
        error_messages={
            "required":"郵箱不可以為空!"
        },
    )
    def clean_password2(self):
        if not self.errors.get("password1"):
            if self.cleaned_data["password2"] != self.cleaned_data["password1"]:
                raise ValidationError("您輸入的密碼不一致,請(qǐng)重新輸入!")
            return self.cleaned_data

views.py

from django.shortcuts import render
from django.contrib.auth import get_user_model
from .forms import *
from django.http import JsonResponse
User = get_user_model() # 獲取User模型
def register(request):
    if request.method == "GET":
        return render(request,"register.html")
    else:
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password1"]
            email = form.cleaned_data["email"]
            username_exists = User.objects.filter(username=username).exists()
            if username_exists:
             return JsonResponse({"code":400,"message":"驗(yàn)證失敗","data":{"username":"您輸入的用戶名已存在!","password1":"","password2":"","email":""}})
            email_exists = User.objects.filter(email=email).exists()
            if email_exists:
                return JsonResponse({"code": 400, "message":"驗(yàn)證失敗","data":{"username": "","password1":"","password2":"", "email": "您輸入的郵箱已存在!"}})
            User.objects.create_user(username=username,password=password,email=email)
            return JsonResponse({"code": 200,"message":"驗(yàn)證通過(guò)", "data":{"username": "","password1":"","password2":"", "email": ""}})
        else:
            return JsonResponse({"code":400,"message":"驗(yàn)證失敗","data":{"username":form.errors.get("username"),"password1":form.errors.get("password1"),"password2":form.errors.get("password2"),"email":form.errors.get("email")}})

登錄功能

form.py:

from django.forms import Form
from django.forms import fields
class LoginForm(Form):
    username = fields.CharField(
        required=True,
        min_length=3,
        max_length=18,
        error_messages={
            "required":"用戶名不可以為空!",
            "min_length":"用戶名不能低于3位!",
            "max_length":"用戶名不能超過(guò)18位!"
        }
    )
    password = fields.CharField(
        required=True,
        error_messages={
            "required":"密碼不可以空",
        }
    )

views.py:

from django.shortcuts import render
from .forms import *
from django.http import JsonResponse
from django.contrib.auth import authenticate
from django.contrib.auth import login
# 登錄視圖名稱不能起成login,與自帶login函數(shù)重名
def loginView(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("password")
            remember = int(request.POST.get("remember"))
            user = authenticate(request,username=username,password=password) # 使用authenticate進(jìn)行登錄驗(yàn)證,驗(yàn)證成功會(huì)返回一個(gè)user對(duì)象,失敗則返回None
            # 使用authenticate驗(yàn)證時(shí)如果is_active為False也會(huì)返回None,導(dǎo)致無(wú)法判斷激活狀態(tài),
            # 此時(shí)可以在seetings中配置:
            # AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']
            if user and user.is_active: # 如果驗(yàn)證成功且用戶已激活執(zhí)行下面代碼
                login(request,user) # 使用自帶的login函數(shù)進(jìn)行登錄,會(huì)自動(dòng)添加session信息
                request.session["username"] = username # 自定義session,login函數(shù)添加的session不滿足時(shí)可以增加自定義的session信息。
                if remember:
                    request.session.set_expiry(None) # 設(shè)置session過(guò)期時(shí)間,None表示使用系統(tǒng)默認(rèn)的過(guò)期時(shí)間 
                else:
                    request.session.set_expiry(0) # 0代表關(guān)閉瀏覽器session失效
                return JsonResponse({"code": 200,"message":"驗(yàn)證通過(guò)","data":{ "error":""}})
            elif user and not user.is_active:
               return JsonResponse({"code": 400, "message": "用戶未激活", "data": {"error": "該用戶還沒(méi)有激活,請(qǐng)a href='#'>激活/a>"}})
            else:
                return JsonResponse({"code": 400, "message": "驗(yàn)證失敗", "data": {"error": "用戶名或密碼錯(cuò)誤"}})
        else:
            return JsonResponse({"code":400,"message":"用戶名或密碼格式錯(cuò)誤","data":{"error":"用戶名或密碼錯(cuò)誤"}})

退出功能

from django.contrib.auth import logout
from django.shortcuts import redirect
# 視圖名不能起成logout
def logoutView(request):
    logout(request) # 調(diào)用django自帶退出功能,會(huì)幫助我們刪除相關(guān)session
    return redirect(request.META["HTTP_REFERER"])

此時(shí)我們就完成了通過(guò)自定義User模型實(shí)現(xiàn)注冊(cè)登錄以及退出一系列的功能,配合前端頁(yè)面就可以完美實(shí)現(xiàn)了。

用戶與權(quán)限管理

定義了用戶模型,就不可避免的涉及到了用戶權(quán)限問(wèn)題,Django同樣內(nèi)置了Permission系統(tǒng),該權(quán)限系統(tǒng)都是針對(duì)表或者模型級(jí)別的,比如某個(gè)模型上的數(shù)據(jù)可以進(jìn)行增刪改查,他不能夠針對(duì)數(shù)據(jù)級(jí)別,比如某個(gè)表中的某條數(shù)據(jù)是否能夠進(jìn)行增刪改查操作(如果要實(shí)現(xiàn)數(shù)據(jù)級(jí)別的,可以考慮使用django-guardian)。

創(chuàng)建完一個(gè)模型后,針對(duì)該模型默認(rèn)有增、刪、改、查四種權(quán)限,權(quán)限存儲(chǔ)了數(shù)據(jù)庫(kù)中的auth_permission表中:

codename表示權(quán)限的名字,name表示權(quán)限的作用,content_type_id表示某張表的id,即用來(lái)綁定數(shù)據(jù)表的,他關(guān)聯(lián)django_content_type這張表:

添加權(quán)限的兩種方法:

#通過(guò)定義模型來(lái)添加權(quán)限:
class Address(models.Model):
    """
    收貨地址
    """
    recv_address = models.TextField(verbose_name = "收貨地址")
    receiver =  models.CharField(max_length=32,verbose_name="接收人")
    recv_phone = models.CharField(max_length=32,verbose_name="收件人電話")
    post_number = models.CharField(max_length=32,verbose_name="郵編")
    buyer_id = models.ForeignKey(to=User,on_delete = models.CASCADE,verbose_name = "用戶id")
    class Meta:
        permissions = (
            ("view_addresses", "查看地址"),
        )
# 通過(guò)代碼添加權(quán)限
from django.contrib.auth.models import Permission,ContentType
from .models import Address
content_type = ContentType.objects.get_for_model(Address)
permission = Permission.objects.create(name = "查看地址",codename = "view_addresses",content_type = content_type)

User模型和權(quán)限之間可以通過(guò)以下幾種方式來(lái)進(jìn)行管理:

1、user.user_permissions.set(permission_list):直接給定一個(gè)權(quán)限的列表。

2、user.user_permissions.add(permission,permission,...):一個(gè)個(gè)添加權(quán)限。

3、user.user_permissions.remover(permission,permission):一個(gè)個(gè)刪除權(quán)限。

4、user.user_permissions.clear():清除權(quán)限

5、user.has_perm('app_name>.'):判斷是否擁有某個(gè)權(quán)限,權(quán)限參數(shù)是一個(gè)字符串,格式是app_name.codename。

6、user.get_all_permission():獲得所有權(quán)限。

我們可以通過(guò)appname_user_user_permission這張表來(lái)查看某個(gè)用戶是否擁有某項(xiàng)權(quán)限:

權(quán)限限定裝飾器:

使用django.contrib.auth.decorators.permission_required可以很方便的檢查某個(gè)用戶是否擁有某項(xiàng)權(quán)限:

from django.contrib.auth.decorators import permission_required
@permission_required('Cart.view_cart',login_url="/login/",raise_exception=True)
# 第一個(gè)參數(shù)代表權(quán)限,login_url表示沒(méi)有登錄的話需要跳轉(zhuǎn)的頁(yè)面,raise_exception表示沒(méi)有權(quán)限是返回403錯(cuò)誤,默認(rèn)是False,會(huì)跳轉(zhuǎn)到login_url指定的頁(yè)面。
def view_cart(request):
 reture HttpResponse("您可以查看購(gòu)物車")

分組

權(quán)限有很多,一個(gè)模型就最少有四個(gè)權(quán)限,如果一些用戶擁有相同的權(quán)限,每次都需要重復(fù)添加是很不方便的,此時(shí)分組功能就可以幫我們解決這個(gè)問(wèn)題,我們可以把一些權(quán)限歸類,然后添加到某個(gè)分組中,之后再把和需要賦予這些權(quán)限的用戶添加的這個(gè)分組中,就比較方便的進(jìn)行管理了。分組我們使用的是django.contrib.auth.models.Group模型,每個(gè)用戶組擁有id和name兩個(gè)字段該模型在數(shù)據(jù)庫(kù)被映射為auth_group數(shù)據(jù)表。

分組操作:

1、Group.objects.create(group_name):創(chuàng)建分組

2、group.permission:某個(gè)分組上的權(quán)限。多堆多的關(guān)系。

group.permission.add:添加權(quán)限。

group.permission.remove:移除權(quán)限。

group.permission.clear:清除所有權(quán)限。

user.get_group_permission():獲取用戶所屬組的權(quán)限。

3、user.groups:某個(gè)用戶上的所有分組。多對(duì)多的關(guān)系。

在模板中使用權(quán)限:

在settings.TEMPLATES.OPTIONS.context_processors下,因?yàn)樘砑恿薲jango.contrib.auth.context_processors.auth上下文處理器,因此可以在模板中直接通過(guò) perms來(lái)獲取用戶的所有權(quán)限:

{% if perms.View.view_cart %}
 購(gòu)物車詳情
{% endif %}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Django認(rèn)證系統(tǒng)user對(duì)象實(shí)現(xiàn)過(guò)程解析
  • Django用戶認(rèn)證系統(tǒng) User對(duì)象解析
  • Django權(quán)限控制的使用
  • Django 權(quán)限管理(permissions)與用戶組(group)詳解
  • Django web自定義通用權(quán)限控制實(shí)現(xiàn)方法
  • Django權(quán)限設(shè)置及驗(yàn)證方式

標(biāo)簽:臨汾 陽(yáng)泉 赤峰 日照 貴州 金華 雙鴨山 克拉瑪依

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Django自定義User模型、認(rèn)證、權(quán)限控制的操作》,本文關(guān)鍵詞  Django,自定義,User,模型,認(rèn)證,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Django自定義User模型、認(rèn)證、權(quán)限控制的操作》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Django自定義User模型、認(rèn)證、權(quán)限控制的操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    www.com在线观看| 成年网址网站在线观看| 国产黄色高清在线| 最新的欧美黄色| 日本美女黄色一级片| 国产欧美日本一区二区三区| 久久一综合视频| 蜜臀av一级做a爰片久久| 亚洲人成网站影音先锋播放| 欧美伦理91| 国产日韩精品一区| av男人天堂网| 日韩在线观看网站| 国产不卡一区二区在线观看| 一级毛片在线播放| 欧美高清视频手机在在线| 青青草av免费在线观看| 国产夜色精品一区二区av| 久久中文字幕免费| 欧美日韩视频网站| 天天干视频在线观看| 交视频在线观看国产| 拍拍拍999自拍偷| 蜜桃精品成人影片| 97精品视频在线观看自产线路二| 欧美日韩一区视频| 欧美成人精品| 欧美熟妇另类久久久久久不卡| 欧美一级高清免费| 精品在线99| 91超薄丝袜肉丝一区二区| 91免费视频污| 日韩国产成人无码av毛片| 国产精品色一区二区三区| 国产91精品露脸国语对白| 麻豆免费在线| 国产精品一国产精品最新章节| 性一交一乱一伧老太| 欧美捆绑视频| 亚洲欧美视频一区二区三区| 91午夜伦伦电影理论片| jizzjizz国产| 少妇熟女一区二区| 亚洲a中文字幕| 国产av国片精品| 粉嫩一区二区三区性色av| 亚洲色图狂野欧美| 成人免费高清在线播放| 成网站在线观看人免费| 日本成人伦理电影| www.欧美日韩国产在线| 特级xxxxx欧美| 啪啪国产精品| 免费在线视频一区二区| 美国av一区二区三区| 亚洲人成777| 久久久午夜影院| 3d动漫精品啪啪一区二区竹菊| 日本一区二区在线视频观看| 亚洲色成人www永久网站| 成人9ⅰ免费影视网站| 芬兰videosfree性少妇| 亚洲精品一区二区在线观看| 国产欧美在线观看免费| 97se狠狠狠综合亚洲狠狠| jizz日本免费| 91网站最新地址| 麻豆传媒视频在线观看| 日本少妇激情视频| 精品一区二区男人吃奶| 精品一区二区三区的国产在线观看| 亚洲成人av片在线观看| 成人午夜精品无码区| 成人一区二区三区| 国产99精品视频| 亚洲免费视频成人| 日本高清久久| 国产亚洲精品自在线观看| 欧美性xxxx交| 9191成人精品久久| 91成人在线播放| 精品久久久在线观看| 精品成人国产在线观看男人呻吟| 久久99精品国产| 日本护士...精品国| 日韩精品一区二区三区视频| 日本精品视频一区二区三区| 国产自产在线视频| 日韩精品一区二区免费| 免费a级毛片永久免费| 成人欧美一区二区三区视频xxx| 67194成人在线观看| 欧美日本精品在线| 欧美日韩国产传媒| 国产精品视频一区二区三区不卡| 黄视频在线观看www| 精品人妻无码一区二区色欲产成人| 中日韩免视频上线全都免费| 四虎影视成人永久免费观看视频| 国产视频一区二区在线观看| 加勒比色老久久爱综合网| 久久艹这里只有精品| 国产精品网站视频| 91麻豆精品91久久久久久清纯| 国产成人激情av| 国产日韩欧美大片| 欧美国产日本| 9色在线观看| 亚洲婷婷丁香| 污污网站免费看| 国产精品久久中文字幕| 五月天婷婷激情视频| 久草福利视频在线| 6699久久国产精品免费| 99re6热在线精品视频播放速度| www.成人黄色| av不卡在线看| 综合久久久久综合| 久久小说免费下载| 久久精品日产第一区二区三区精品版| 91短视频版在线观看www免费| 黄色在线观看视频网站| gv天堂gv无码男同在线观看| 一分钟免费观看视频播放www| 欧美洲成人男女午夜视频| 国产精品自产拍在线观| 最近最新中文字幕在线| 久久一区二区三区欧美亚洲| 麻豆网站在线免费观看| 男人的天堂在线播放| 国产在线天堂www网在线观看| 日韩精品亚洲精品| aaa免费在线观看| 91视频 -- 69xx| 蜜臀av无码一区二区三区| jizzjizz19| 日韩最新av在线| 国产aaa免费视频| 97在线免费观看视频| 九九综合九九| 国产亚洲欧美另类中文| 国产资源在线免费观看| 亚洲成人午夜在线| 91成人国产精品| 国产一区二区视频在线观看免费| 性色av一区二区怡红| 另类图片亚洲色图| 91精品啪在线观看国产爱臀| 97在线国产视频| 一道本在线免费视频| 欧美a级黄色大片| 婷婷国产精品| 久久亚洲私人国产精品va媚药| 国产精品一二三在线观看| 日本欧洲国产一区二区| 亚洲精品日韩激情在线电影| 欧美激情国内自拍| 不用播放器成人网| 精品一区二区三区视频| 偷拍自拍在线看| 在线免费三级电影网站| av午夜在线| 国产精品永久久久久久久久久| 欧美激情欧美激情在线五月| 国产欧美日韩一区二区三区在线观看| 国产一区二区在线视频你懂的| 国产91久久久| 成人精品三级| 亚洲一区二区不卡视频| 国产精品9区| 亚洲福利一区二区| 欧美色男人天堂| 一本色道久久精品| 日本在线成人| 亚洲精品国产一区黑色丝袜| 国产精品欧美极品| 欧美日韩大片免费观看| 欧美日韩日本国产| 国内自拍视频一区二区三区| 91免费公开视频| 中文字幕在线播放网址| 亚洲色图偷拍视频| 国产日韩视频在线观看| aa级大片免费在线观看| 新版中文字幕在线资源| 国产精品v片在线观看不卡| 日本午夜精品理论片a级app发布| 天堂资源在线中文精品| 久久精品国产亚洲a∨麻豆| 天天干夜夜干| 99亚洲伊人久久精品影院| 激情网址大全| 中文字幕精品在线| 日本免费不卡视频| 国产又粗又猛又色| 国产精品爽爽爽| 精品视频一区二区在线观看| 免费大片在线观看www| 欧美不卡在线一区二区三区| а√天堂中文资源在线bt| 91精品视频在线播放| 福利在线视频导航| se01亚洲视频| 国产精品香蕉国产| 夜夜躁狠狠躁日日躁av| 国产精品 欧美 日韩| 国产一区二区三区无遮挡| 秋霞毛片久久久久久久久| 亚洲www啪成人一区二区| 国产成人无码av| 你懂的视频在线| 99久久亚洲国产日韩美女| 99久久伊人精品| 天堂中文av在线| 榴莲视频成人app| 欧美黄色免费网址| 中文字幕在线免费观看视频| 国产精品久久久久久久乖乖| 国产成a人无v码亚洲福利| 天堂中文字幕| 国产树林野战在线播放| 国产一级免费片| 日韩美女一级片| 天天操天天是| 国产精品99精品| 在线播放亚洲精品| 乱精品一区字幕二区| 国产成人在线影院| av在线资源| 中文字幕av一区二区三区四区| 黄色激情视频网址| 五月婷婷免费视频| 国产精品久久久久9999高清| 人妻无码一区二区三区久久99| 分分操这里只有精品| 国产日韩欧美精品在线| 受虐m奴xxx在线观看| 少妇毛片一区二区三区| 伊人中文在线| 久久精品国产99国产精品| 亚洲一二av| 国产日产一区二区三区| 91午夜精品| 极品美女销魂一区二区三区免费| 国产不卡视频在线观看| 国产精品区在线| 亚洲中文字幕无码不卡电影| 亚洲精品自拍视频在线观看| 亚洲成人免费视频| 欧美一级二级三级区| 精品国产中文字幕| 亚洲高清av一区二区三区| 中文字幕精品综合| 乱亲女秽乱长久久久| 在线成人av网站| 多男操一女视频| 三级毛片网站| 中国一级片黄色一级片黄| 992tv在线观看| 亚洲国产成人精品女人久久| 美女国产精品| 三区在线观看| 婷婷av在线| 亚洲欧美久久| 五月激情六月婷婷| 91精品国产乱码久久久| 香蕉视频国产在线观看| 日本粉色视频在线观看| 色播视频在线播放| 人人干人人看| av网站在线免费| 国产精品自在欧美一区| 日本三级中文字幕在线观看| 一本一道精品欧美中文字幕| 99久久国产视频| 秋霞在线观看一区二区三区| 超碰97人人射妻| 日产精品久久久| 国产精品久久久久久久久久免费看| 亚洲精品ww久久久久久p站| 国产欧美在线观看免费| 91极品美女在线| 国产中文字幕在线看| 亚洲一区二区三区四区在线| 欧美亚洲一区| 日韩子在线观看| 久久婷婷影院| 国产成人综合欧美精品久久| 欧美视频一区在线观看| 成人淫片在线看| 精品视频二区| 国产欧美日韩久久| 中文字幕在线观看第一页| 亚洲天堂男人av| 极品盗摄国产盗摄合集| 亚洲精品成人电影| 国产丝袜一区二区三区| 一区二区三区日韩视频| 欧美成人精品一级| 亚洲人成网站999久久久综合| 国内精品久久久久久久影视麻豆| 久久久久久久久毛片| 中文字幕日韩在线视频| 亚洲最大成人av| xxxx在线播放| 成人性生交大片免费看中文| 亚洲免费播放| 日韩在线视频网| 狠狠色综合欧美激情| 91在线视频观看免费| 国产伦精品一区二区三区视频| 亚洲午夜激情av| 国产美女久久久| 国产探花一区在线观看| 久久成人福利| 国产成人调教视频在线观看| 欧美视频在线观看| 成人综合婷婷国产精品久久蜜臀| 成人短视频软件网站大全app| 亚洲国产毛片aaaaa无费看| 影音先锋日韩av| 99精品视频一区| 美女免费视频一区二区| 久久精品青青大伊人av| 欧美成人黄色网址| a级片在线免费| 久热成人在线视频| 亚洲调教视频在线观看|