zoukankan      html  css  js  c++  java
  • 项目准备流程和django权限六表

    项目准备流程 和 django权限六表

    一、项目准备

    1.创建django项目

    2、创建数据库 —— init文件中声明mysql —— 也可以直接在settings中配置声明
    项目名/应用名.init.py

    import pymysql
    pymysql.install_as_MySQLdb()
    

    或在settings.py中配置并声明

    # 直接在配置中声明mysql(建议这样写)
    import pymysql
    pymysql.install_as_MySQLdb()
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'dg_proj',  # 数据库名
            'USER': 'root',
            'PASSWORD': '',
        }
    }
    

    3.配置国际化

    # 国际化 汉化
    LANGUAGE_CODE = 'zh-hans'
    
    TIME_ZONE = 'Asia/Shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = False
    

    4.创建media文件夹——配置文件中配置

    ​ 项目中自新建media文件夹

    # 自己配置的 图像文件夹和路经,用户上传等图像文件保存在此;
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    

    5、drf框架相关配置

    配置文件中注册drf

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'api.apps.ApiConfig',
    
        'rest_framework',
    ]
    

    **新建utils文件夹存放自定义功能 —— 放入自己二次封装的responces 和 自定义的异常模块 —— 注册 **

    img

    REST_FRAMEWORK = {
        # 全局配置异常模块
        'EXCEPTION_HANDLER': 'utils.exception.exception_handler',
       
    }
    

    6、项目下总路由

    # 导入 include,进行路由分发
    from django.conf.urls import url, include
    from django.contrib import admin
    
    from django.views.static import serve
    from django.conf import settings
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^api/', include('api.urls')),
    	
        # 配置 media 开放路径
        url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
    ]
    

    7、应用api下子路由

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^test/$', views.TestAPIView.as_view()),
        url(r'^test1/$', views.TestAuthenticatedAPIView.as_view()),
        url(r'^test2/$', views.TestAuthenticatedOrReadOnlyAPIView.as_view()),
        url(r'^test3/$', views.TestAdminOrReadOnlyAPIView.as_view()),
    ]
    

    二、权限六表

    1.认证方式 # RBAC(基于角色的访问控制)

    基于用户权限访问控制的认证 - RBAC - Role-Based Access Control
    自己了解:基于auth的认证规则
    基于jwt的认证责任——企业常用
    Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则、五表规则,Django采用的是六表规则
    

    2.表分析

    三表:用户表、角色表、权限表五表:用户表、角色表、权限表、用户角色关系表、角色权限关系表六表:用户表、角色表、权限表、用户角色关系表、角色权限关系表、用户权限关系表
    

    img

    3.六表间信息交互(正反向查询)

    用户表:访问角色groups,访问权限user permissions
    角色表:访问用户user_set,访问权限permissions
    权限表:访问用户user_set,访问角色group_set(这一个源码中无提示)
    

    img

    img

    img

    4、models中自定义用户表测试

    models.py

    from django.db import models
    from django.contrib.auth.models import AbstractUser,User
    class User(AbstractUser):
        mobile = models.CharField(max_length=11, unique=True)
    
        class Meta:
            db_table = 'api_user'
            verbose_name = '用户表'  # admin中用来显示的表名
            verbose_name_plural = verbose_name  # 表名字最后不加s
    
        def __str__(self):
            return self.username  # 让admin中每个用户名显示自己用户名,不写默认名全都一样
    
    # 写完后去settings中配置自定义的user表,然后数据库迁移
    AUTH_USER_MODEL = 'api.User'
    

    img

    5、数据库迁移失败问题

    重点:如果自定义User表后,再另一个项目中采用原生User表,完成数据库迁移时,可能失败
      1)卸载Django重新装
      2)将django.contrib下面的admin、auth下的数据库迁移记录文件清空,不要删除init文件
    

    6、写测试脚本 测试六表间信息交互

    test.py

    # django脚本话启动
    import os, django
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dg_proj.settings")
    django.setup()
    
    #用户访问其他表
    from api import models
    user = models.User.objects.first()  # type: models.User
    print(user.username)
    print(user.groups.first().name)
    print(user.user_permissions.first().name)
    
    # 角色表访问其他表
    from django.contrib.auth.models import Group
    group = Group.objects.first()
    print(group.name)
    print(group.user_set.first().username)
    print(group.permissions.first().name)
    
    # 权限表访问其他表
    from django.contrib.auth.models import Permission
    p_16 = Permission.objects.filter(pk=16).first()
    print(p_16.user_set.first().username)
    p_17 = Permission.objects.filter(pk=17).first()
    print(p_17.group_set.first().name)
    
  • 相关阅读:
    exercise 1-6
    第五章 Inheritance继承
    wk1&2 字符串
    <转>Python 多线程的单cpu与cpu上的多线程的区别
    Python字典增删操作技巧简述
    Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
    <转>Python3.x和Python2.x的区别介绍
    <转>Python运行的17个时新手常见错误小结
    常见测试流程
    <转>数据库设计的三大范式
  • 原文地址:https://www.cnblogs.com/chmily/p/12031915.html
Copyright © 2011-2022 走看看