午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Django自定義User模型、認證、權限控制的操作

Django自定義User模型、認證、權限控制的操作

熱門標簽:蓋州市地圖標注 地圖標注微信發送位置不顯示 地圖標注的意義點 地圖制圖標注位置改變是移位嗎 上海機器人外呼系統哪家好 315電話機器人廣告 房產電銷外呼系統 南京銷售外呼系統軟件 浙江電銷卡外呼系統好用嗎

Django自帶強大的User系統,為我們提供用戶認證、權限、組等一系列功能,可以快速建立一個完整的后臺功能。

但User模型并不能滿足我們的需求,例如自帶的User表中沒有手機號碼,而且對于國人來說表中的first_name和last_name并沒有什么卵用,對于實際生產中靈活的用戶表來說重寫User模型是非常有必要的。

擴展User模型

擴展User模型有許多的方法:

1、Proxy繼承:

代理繼承,此方法只能夠繼承User本身擁有的字段,并不能夠添加和刪改,不會影響表中原有的結構,但是可以定義一些方法來獲取我們需要的數據:

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

2、一對一外鍵:

如果我們對User本身的字段和驗證方法沒有要求,只是想要增加額外字段,可以通過創建另外一張表去關聯User表,從而添加額外字段,并且我們可以寫一個接受保存模型的信號處理方法,只要User調用了save方法,那么關聯表就會自動添加一條數據與User新添加的用戶進行綁定:

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

3、繼承AbstractUser自定義模型:

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

from django.contrib.auth.models import BaseUserManager,AbstractUser
from shortuuidfield import ShortUUIDField # 使用shortuuid作為User表的主鍵,使數據更加的安全
class UserManager(BaseUserManager): #自定義Manager管理器
    def _create_user(self,username,password,email,**kwargs):
        if not username:
            raise ValueError("請傳入用戶名!")
        if not password:
            raise ValueError("請傳入密碼!")
        if not email:
            raise ValueError("請傳入郵箱地址!")
        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(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="手機號碼")
    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="激活狀態")
    is_staff = models.BooleanField(default=True,verbose_name="是否是員工")
    date_joined = models.DateTimeField(auto_now_add=True)
    USERNAME_FIELD = 'username' # 使用authenticate驗證時使用的驗證字段,可以換成其他字段,但驗證字段必須是唯一的,即設置了unique=True
    REQUIRED_FIELDS = ['email'] # 創建用戶時必須填寫的字段,除了該列表里的字段還包括password字段以及USERNAME_FIELD中的字段
    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

自定義好User模型之后還需要在settings中設置系統才會識別當前User模型作為系統默認User模型,settings中需要先安裝app,然后添加AUTH_USER_MODEL=‘app.User':

 

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

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

繼承AbstracUser類自定義User有一個不好的地方,就是我們沒有辦法改變其已有的字段,比如first_name和last_name我們并不需要,這個時候就可以繼承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("請傳入用戶名!")
        if not password:
            raise ValueError("請傳入密碼!")
        if not email:
            raise ValueError("請傳入郵箱地址!")
        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="手機號碼")
    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="激活狀態")
    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

此時數據庫中只會生成我們定義好的字段。

定義好了User模型我們就可以使用Django自帶的登錄驗證和權限系統了。

首先注冊功能:

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":"用戶名不能超過18位!"
        }
    )
    password1 = fields.CharField(
        required=True,
        min_length=3,
        max_length=18,
        error_messages={
            "required":"密碼不可以空",
            "min_length": "密碼不能低于3位!",
            "max_length": "密碼不能超過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("您輸入的密碼不一致,請重新輸入!")
            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":"驗證失敗","data":{"username":"您輸入的用戶名已存在!","password1":"","password2":"","email":""}})
            email_exists = User.objects.filter(email=email).exists()
            if email_exists:
                return JsonResponse({"code": 400, "message":"驗證失敗","data":{"username": "","password1":"","password2":"", "email": "您輸入的郵箱已存在!"}})
            User.objects.create_user(username=username,password=password,email=email)
            return JsonResponse({"code": 200,"message":"驗證通過", "data":{"username": "","password1":"","password2":"", "email": ""}})
        else:
            return JsonResponse({"code":400,"message":"驗證失敗","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":"用戶名不能超過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函數重名
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進行登錄驗證,驗證成功會返回一個user對象,失敗則返回None
            # 使用authenticate驗證時如果is_active為False也會返回None,導致無法判斷激活狀態,
            # 此時可以在seetings中配置:
            # AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']
            if user and user.is_active: # 如果驗證成功且用戶已激活執行下面代碼
                login(request,user) # 使用自帶的login函數進行登錄,會自動添加session信息
                request.session["username"] = username # 自定義session,login函數添加的session不滿足時可以增加自定義的session信息。
                if remember:
                    request.session.set_expiry(None) # 設置session過期時間,None表示使用系統默認的過期時間 
                else:
                    request.session.set_expiry(0) # 0代表關閉瀏覽器session失效
                return JsonResponse({"code": 200,"message":"驗證通過","data":{ "error":""}})
            elif user and not user.is_active:
               return JsonResponse({"code": 400, "message": "用戶未激活", "data": {"error": "該用戶還沒有激活,請a href='#'>激活/a>"}})
            else:
                return JsonResponse({"code": 400, "message": "驗證失敗", "data": {"error": "用戶名或密碼錯誤"}})
        else:
            return JsonResponse({"code":400,"message":"用戶名或密碼格式錯誤","data":{"error":"用戶名或密碼錯誤"}})

退出功能

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

此時我們就完成了通過自定義User模型實現注冊登錄以及退出一系列的功能,配合前端頁面就可以完美實現了。

用戶與權限管理

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

創建完一個模型后,針對該模型默認有增、刪、改、查四種權限,權限存儲了數據庫中的auth_permission表中:

codename表示權限的名字,name表示權限的作用,content_type_id表示某張表的id,即用來綁定數據表的,他關聯django_content_type這張表:

添加權限的兩種方法:

#通過定義模型來添加權限:
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", "查看地址"),
        )
# 通過代碼添加權限
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模型和權限之間可以通過以下幾種方式來進行管理:

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

2、user.user_permissions.add(permission,permission,...):一個個添加權限。

3、user.user_permissions.remover(permission,permission):一個個刪除權限。

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

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

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

我們可以通過appname_user_user_permission這張表來查看某個用戶是否擁有某項權限:

權限限定裝飾器:

使用django.contrib.auth.decorators.permission_required可以很方便的檢查某個用戶是否擁有某項權限:

from django.contrib.auth.decorators import permission_required
@permission_required('Cart.view_cart',login_url="/login/",raise_exception=True)
# 第一個參數代表權限,login_url表示沒有登錄的話需要跳轉的頁面,raise_exception表示沒有權限是返回403錯誤,默認是False,會跳轉到login_url指定的頁面。
def view_cart(request):
 reture HttpResponse("您可以查看購物車")

分組

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

分組操作:

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

2、group.permission:某個分組上的權限。多堆多的關系。

group.permission.add:添加權限。

group.permission.remove:移除權限。

group.permission.clear:清除所有權限。

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

3、user.groups:某個用戶上的所有分組。多對多的關系。

在模板中使用權限:

在settings.TEMPLATES.OPTIONS.context_processors下,因為添加了django.contrib.auth.context_processors.auth上下文處理器,因此可以在模板中直接通過 perms來獲取用戶的所有權限:

{% if perms.View.view_cart %}
 購物車詳情
{% endif %}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Django認證系統user對象實現過程解析
  • Django用戶認證系統 User對象解析
  • Django權限控制的使用
  • Django 權限管理(permissions)與用戶組(group)詳解
  • Django web自定義通用權限控制實現方法
  • Django權限設置及驗證方式

標簽:臨汾 陽泉 赤峰 日照 貴州 金華 雙鴨山 克拉瑪依

巨人網絡通訊聲明:本文標題《Django自定義User模型、認證、權限控制的操作》,本文關鍵詞  Django,自定義,User,模型,認證,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Django自定義User模型、認證、權限控制的操作》相關的同類信息!
  • 本頁收集關于Django自定義User模型、認證、權限控制的操作的相關信息資訊供網民參考!
  • 推薦文章
    欧美亚日韩国产aⅴ精品中极品| 欧美激情奇米色| 免费观看一区二区三区| 国产精品麻豆视频| 色噜噜一区二区| 成人av电影在线| 在线看视频不卡| 成人国产精品视频| 午夜啪啪福利视频| 国产日韩av一区| 日韩精彩视频| 中文字幕国产精品一区二区| 欧美aaaaa喷水| 成人国产免费视频| 久久亚洲中文字幕无码| 天天色天天爱天天射综合| 凹凸日日摸日日碰夜夜爽1| 91成人在线免费观看| 国产精品无码毛片| 亚洲精品国产综合久久| 特级片在线观看| 日韩精品自拍偷拍| 国产午夜精品理论片在线| 欧美日本韩国一区二区三区视频| 亚洲精品国产成人av在线| 亚洲成人av中文字幕| 日韩av在线天堂| 国产精品久久久久久久久久ktv| 一级黄色片在线播放| 亚洲最大的av网站| 国产精品综合一区二区| www.好吊操| 欧美顶级少妇做爰| 一区二区三区视频免费看| 国产精品久久久久久一区二区| 精品一二三四在线| 乱妇乱女熟妇熟女网站| 在线观看欧美日本| 久草综合在线视频| 成人国产在线视频| 国产香蕉久久精品综合网| 成人免费播放视频| 夜夜嗨av一区二区三区四区| 免费观看黄色一级视频| 性欧美.com| 色综合久久精品| 日本一区二区欧美| 成人在线视频网站| 亚洲欧美电影院| 中文字幕不卡在线播放| 成人日韩av在线| 亚洲天堂久久久久久久| www.黄色在线| 国产在线一区二区三区| 亚洲男人的天堂一区二区| 国产97免费视频| 国产精品乱码视频| 中文字幕第一区第二区| 性生交大片免费全黄| 99在线视频首页| 性做久久久久久免费观看欧美| 久久精品免费在线| 日韩欧美第二区在线观看| 91麻豆精品国产91久久久使用方法 | 国产精品久久久久999| 国产精品福利一区二区| 四虎免费在线视频| 欧美高清视频一区| 日韩欧美高清一区| 开心九九激情九九欧美日韩精美视频电影 | 在线免费看视频| 国产精品成人观看视频免费| 欧美日韩中字一区| 国产jzjzjz丝袜老师水多 | 中文字幕久久综合| 亚洲国产欧美一区二区三区同亚洲 | 国产视频精品在线| 97se亚洲国产综合自在线观| 永久免费看mv网站入口| 一区高清视频| 中文字幕无线精品亚洲乱码一区 | 日韩av在线电影网| caoporen国产精品视频| www日韩在线| 大陆极品少妇内射aaaaaa| 中文字幕精品久久久久| 国产精品久久久久久久蜜臀| 亚洲色图第一区| 杨幂一区二区国产精品| 国产精品入口免费视| 欧美一区午夜视频在线观看| 极品美女销魂一区二区三区| 天天色影综合网| 4444亚洲人成无码网在线观看| 日韩欧美的一区| 成人黄色一级视频| 51国产偷自视频区视频| 日本a√在线观看| 日韩av片永久免费网站| 亚洲人一二三区| 可以免费看不卡的av网站| 放荡的美妇在线播放| 国产曰肥老太婆无遮挡| 久久777国产线看观看精品| 一本大道av伊人久久综合| 成人无码一区二区三区| 精品女人久久久| 免费看黄在线看| 日本中文字幕成人| 色偷偷成人一区二区三区91| 搡老岳熟女国产熟妇| 色哟哟视频在线| 国产一区二区三区av在线| 日韩精品中文在线观看| 成人免费在线视频观看| 蜜桃视频第一区免费观看| 国产污污视频在线观看| 深夜黄色小视频| 中文精品一区二区三区| 日韩av第一页| 日韩欧美高清dvd碟片| 亚洲三级电影全部在线观看高清| 国产在线精品免费av| 国产成人精品一区二区无码呦| 在线观看黄网址| 久久久久久久久久毛片| 天天做天天躁天天躁| 日韩中文一区| 国产精品乱码一区二区三区| 欧美在线视频网站| 亚洲丝袜精品丝袜在线| 99久久99久久精品免费看蜜桃| 五月婷婷在线播放| 中文字幕在线观看欧美| 亚洲一区欧美在线| 欧美三级黄色大片| 超碰人人干人人| 国产人成视频在线观看| 日本在线视频www色| 免费精品视频一区| 国产精品一区免费观看| 91精品久久久久久久久久久| 人人澡人人澡人人看欧美| 日韩在线视频观看| 精品国产a毛片| 欧美一二三四区在线| 精品婷婷伊人一区三区三| 五月天中文字幕一区二区| 亚洲码国产岛国毛片在线| 国产欧美一区视频| 国产色产综合产在线视频| 久久亚洲免费视频| 亚洲国产精品成人久久综合一区| 久久亚洲二区三区| 国产精品婷婷午夜在线观看| 中国色在线观看另类| 国产精品三级av在线播放| 国产精品国产三级国产三级人妇| 国产麻豆精品theporn| 五月婷婷六月色| 精品一区二区三区免费视频| 国产成人午夜精品5599| 91小视频在线免费看| 国产精品女主播在线观看| 亚洲欧美激情一区二区| 婷婷综合五月天| 欧美电影一区二区| 日韩国产精品视频| 欧美刺激性大交免费视频| 777精品视频| 97中文在线观看| 欧美成人一区二区在线| 天堂av在线中文| 青青草视频国产| 国产精欧美一区二区三区白种人| 污免费在线观看| 色哟哟一一国产精品| 91久久国语露脸精品国产高跟| 亚洲乱码在线观看| 成人网男人的天堂| 国产精品久久久久影院亚瑟| 日本韩国欧美一区二区三区| 精品对白一区国产伦| 欧美精品亚州精品| 91在线高清视频| 波多野结衣与黑人| 中文字幕第3页| 中文人妻av久久人妻18| 免费成人av资源网| 亚洲欧美区自拍先锋| 欧美变态口味重另类| 777午夜精品福利在线观看| 欧美日韩三区四区| 91视频免费版污| 免费中文字幕在线| 日韩精品一区第一页| 日韩一区中文字幕| 日韩精品极品毛片系列视频| 国产成人免费av电影| 偷拍盗摄高潮叫床对白清晰| 午夜不卡久久精品无码免费| 久久久久久无码精品大片| 精品在线观看视频| 91国偷自产一区二区三区观看| 久久激情视频久久| 成人久久精品视频| 一区二区在线播放视频| 中日韩一级黄色片| 国产喷水吹潮视频www| 日本一区二区在线不卡| 日韩久久免费电影| 91久久伊人青青碰碰婷婷| 亚洲国产日韩美| av手机在线播放| 另类欧美日韩国产在线| 欧美午夜一区二区| 国产精品久久久久久久久久东京| 国产真实乱子伦| 91porny九色| 亚洲欧洲精品一区二区精品久久久 | 无码人妻精品一区二区三区9厂| 日日摸夜夜添夜夜添精品视频 | 蜜臀久久99精品久久久久宅男 | 久久久久91| 色妹子一区二区| 91亚洲国产成人精品性色| 佐佐木明希电影| 丝袜亚洲另类欧美| 日韩片之四级片| 国产在线视频不卡| 成人性生活免费看| 国内精品伊人久久久久av影院| 精品高清美女精品国产区| 国产精品一区二区性色av| 日本国产在线播放| 看片网站在线观看| 国产一区三区三区| 欧美三级在线播放| 精品国产一区二区三区麻豆小说 | 欧美另类在线播放| 成年人在线观看视频免费| 日韩欧美激情视频| 亚洲精品你懂的| 国产日韩在线观看av| 在哪里可以看毛片| 国产亚洲一区二区三区| 欧美在线视频一区二区| 中文字幕一区三区久久女搜查官| 国产剧情一区二区三区| 久久久www成人免费精品| 国产aaaaa毛片| 国产一区二区在线观看免费| 这里只有精品在线播放| 波多野结衣av一区二区全免费观看| 国产又粗又长视频| 精品剧情在线观看| 人人干视频在线| 免费在线欧美视频| 久久精品精品电影网| 无码人妻一区二区三区一| 暴力调教一区二区三区| 欧美福利视频在线| 88av在线播放| 亚洲人xxxx| 超碰97人人人人人蜜桃| www.com国产| 欧美大胆人体bbbb| 欧美 日韩 国产在线观看| 国产一区在线观看视频| 午夜免费日韩视频| 日本福利片在线观看| 在线视频综合导航| 国产欧美日韩网站| 91精品国产高清一区二区三区蜜臀 | 亚洲国产成人精品女人久久久| 欧美国产视频在线观看| 久久精品一区二区三| 亚洲精品欧美激情| 97色伦亚洲国产| 中国美女黄色一级片| 欧美日韩亚洲精品一区二区三区 | 国产精品久久国产精麻豆99网站| 国产啪精品视频网站| 久久99久久98精品免观看软件 | 九九久久99| 亚洲三区在线播放| 亚洲人成在线播放| 国内外成人免费在线视频| 99精品欧美一区二区蜜桃免费 | 国产精品视频最多的网站| 国产一级片毛片| 一区二区三区无码高清视频| avav在线看| 国产色产综合产在线视频| 亚洲成人蜜桃| 成人av手机在线观看| 日本一区视频在线观看| 久久电影网站中文字幕| 国产精品久久久亚洲| 精品一区二区三区视频在线观看 | 91国偷自产一区二区使用方法| 8x8x成人免费视频| 精品久久一区二区| 亚洲女人毛茸茸高潮| 日韩av一区在线观看| 豆国产97在线 | 亚洲| 中文日韩在线视频| 国产又大又粗又长| 热门国产精品亚洲第一区在线| 污污视频在线免费看| 免费成人看片网址| 久久国产精品第一页| 色哟哟一区二区三区| 在线观看高清免费视频| 久久久久99精品一区| 香蕉视频在线网址| 国产美女久久久久| 欧美视频1区| 国产一区二区精品久久91| **亚洲第一综合导航网站| 蜜臀a∨国产成人精品| 欧美激情第一页在线观看| 北岛玲一区二区三区四区| 欧美精品福利在线| 日韩欧美不卡视频| 97国产精品视频人人做人人爱| 国产sm主人调教女m视频| 国产在线高清精品| 亚洲日本在线播放| 亚洲欧美日韩在线综合 | 亚洲综合图片一区| 欧美疯狂性受xxxxx另类| av男人天堂av| 日韩精品欧美在线| 久久婷婷综合激情| 在线免费看v片| 亚洲欧美制服另类日韩| av中文字幕免费| 亚洲欧洲久久| 香蕉成人啪国产精品视频综合网| 黄色片视频免费观看| 久久精品国产2020观看福利| 99精品在线看| 久久婷婷开心| **欧美大码日韩| 一二三四国产精品| 国产va免费精品高清在线| 成人18精品视频| 国产福利在线免费| 日韩在线免费视频观看| 国产女人18毛片水真多| 亚洲自拍三区| 色婷婷av一区二区三区软件 | 一区二区精品视频| 欧美日本在线视频| 69亚洲精品久久久蜜桃小说| 久久青青草综合| 色综合久久久久综合| 日韩熟女一区二区| 久久香蕉综合色| 国产精品免费aⅴ片在线观看| 人与动物性xxxx| 国产精品美女久久久久av福利| 天天av天天翘天天综合网 | 国产真实的和子乱拍在线观看| 国内精品国语自产拍在线观看| 色综合久久99| 精人妻无码一区二区三区| 午夜精品美女久久久久av福利| 欧美日韩一区二区三区四区五区 | 日韩精品视频免费| 国产成人精品影视| 国产av自拍一区| 999热视频在线观看| 午夜精品在线看| 国产又爽又黄又嫩又猛又粗| 日韩黄色片在线| 亚洲韩国欧洲国产日产av| 国产乱人伦精品一区二区在线观看| 中文字幕99页| 99视频在线播放| 91麻豆精品国产91久久久资源速度 | 国内精品视频一区二区三区八戒 | 国产精品国产三级国产aⅴ无密码| 日本五十路女优| 国产超级av在线| 欧美一级黄色网| 日韩欧美在线播放| 亚洲aⅴ在线观看| 91精品人妻一区二区三区| 麻豆成人在线播放| 亚洲人成毛片在线播放| 久久在线观看免费| 9i看片成人免费看片| 国产一区视频免费观看| 国产精品情侣自拍| 91精品国产综合久久久蜜臀图片| 麻豆国产欧美日韩综合精品二区| 日本污视频网站| 国产激情在线看| 欧美一乱一性一交一视频| 午夜欧美大尺度福利影院在线看| 米奇777在线欧美播放| 亚洲综合第一区| 国产www免费| 99精品99久久久久久宅男| 亚洲日韩欧美视频| 午夜欧美在线一二页| av 一区二区三区| 亚洲欧美va天堂人熟伦|