zoukankan      html  css  js  c++  java
  • django 初始化项目 和modelviewset 使用

    django初始化项目

    1.初始化项目结构└─shiyanlou_project


    │ .gitignore
    │ README.en.md # 英文
    │ README.md # 中文项目简介

    ├─celery_task # 用来存放celery相关文件
    │ init.py

    ├─db # 数据库相关:1.数据库初始化sql脚本; 2.数据库维护脚本,清
    理,备份脚本
    ├─logs # 存放日志
    ├─packages # 外部包,原始的,未配置的:1.七牛云sdk;2.阿里云短信;
    ├─scrips # 脚本目录:1.定时任务脚本;2.页面静态化脚本;处理项目脚本
    └─uwsgi_conf # uwsgi配置,日志,pid


    └─syl
    │ apps (python包) # Django各种app模块
    │ libs (python包) # 七牛云sdk+配置
    │ utils (python包) # 小工具,常用函数
    │ static
    │ templates
    │ syl(项目配置)
    │ manager.py

    2.创建Django项目

     python manage.py startproject  syl

    3.创建user模型 创建三个包

    syl) root@dev:shiyanlou_project/syl

    libs  apps  utils libs

    3.1 创建用户模型user

    syl) root@dev:shiyanlou_project/syl/apps

    python manage.py startapp user

    3.2 在setting.py中注册user模型(第一步)

    NSTALLED_APPS = [
    'user.apps.UserConfig',
    ]
    

    3.3 syl/urls.py添加主路由(第二步)

    import sys
    sys.path.insert(0,os.path.join(BASE_DIR,'apps'))
    

    3.4 创建 user/urls.py子路由文件(第三步)

    4.重写Django默认认证用户模型

    4.1 user/models.py创建模型:从写django user表


    class User(AbstractUser):   phone = models.CharField('手机号',max_length=20)   img = models.ImageField(upload_to='user',null=True)   nick_name = models.CharField('昵称',max_length=20)   address = models.CharField('地址',max_length=255)   class Meta:   db_table = 'tb_user'

    4.2 syl/settings.py中注册自己的用户模型类

    注册自己的用户模型类:应用名.模型名字,指定我们重写的user表进行身份验证

    AUTH_USER_MODEL = 'user.User'

    4.3 配置mysql

    DATABASES = {
      'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'syldb', # 指定数据库名称:MyCRM
      'USER': 'root',
      'PASSWORD': '1',
      'HOST': '127.0.0.1',
      'PORT': '3306',
      }
    }
    

     4.4生成表 

    python manager.py makemigrations
    python manager.py migrate
    

    django 配置 viewset使用

      

    在seettings.py 中注册

    NSTALLED_APPS=[
    
    ​ 'django_filters',
    
    ​ 'rest_framework',
    
    ]
    


    REST_FRAMEWORK = { # 文档报错: AttributeError: ‘AutoSchema’ object has no attribute ‘get_link’ # 用下面的设置可以解决 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema', # 默认设置是: # 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.openapi.AutoSchema', # 异常处理器 # 'EXCEPTION_HANDLER': 'user.utils.exception_handler', # Base API policies 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ], 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser' ], # 1.认证器(全局) 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', # 使用session时的认证器 'rest_framework.authentication.BasicAuthentication' # 提交表单时的认证器 ], #2.权限配置(全局): 顺序靠上的严格 'DEFAULT_PERMISSION_CLASSES': [ # 'rest_framework.permissions.IsAdminUser', # 管理员可以访问 # 'rest_framework.permissions.IsAuthenticated', # 认证用户可以访问 # 'rest_framework.permissions.IsAuthenticatedOrReadOnly', # 认证用户可以访问, 否则只能读取 # 'rest_framework.permissions.AllowAny', # 所有用户都可以访问 ], #3.限流(防爬虫) 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', 'rest_framework.throttling.UserRateThrottle', ], #3.1限流策略 'DEFAULT_THROTTLE_RATES': { 'user': '100/hour', # 认证用户每小时100次 'anon': '3/day', # 未认证用户每天能访问3次 }, 'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation', 'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata', 'DEFAULT_VERSIONING_CLASS': None, #4.分页(全局):全局分页器, 例如 省市区的数据自定义分页器, 不需要分页 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # 每页返回数量 'PAGE_SIZE': 10, # 默认 None #5.过滤器后端 'DEFAULT_FILTER_BACKENDS': [ 'django_filters.rest_framework.DjangoFilterBackend', # 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化 ], #5.1过滤排序(全局):Filtering 过滤排序 'SEARCH_PARAM': 'search', 'ORDERING_PARAM': 'ordering', 'NUM_PROXIES': None, #6.版本控制:Versioning 接口版本控制 'DEFAULT_VERSION': None, 'ALLOWED_VERSIONS': None, 'VERSION_PARAM': 'version', # Authentication 认证 # 未认证用户使用的用户类型 'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser', # 未认证用户使用的Token值 'UNAUTHENTICATED_TOKEN': None, # View configuration 'VIEW_NAME_FUNCTION': 'rest_framework.views.get_view_name', 'VIEW_DESCRIPTION_FUNCTION': 'rest_framework.views.get_view_description', 'NON_FIELD_ERRORS_KEY': 'non_field_errors', # Testing 'TEST_REQUEST_RENDERER_CLASSES': [ 'rest_framework.renderers.MultiPartRenderer', 'rest_framework.renderers.JSONRenderer' ], 'TEST_REQUEST_DEFAULT_FORMAT': 'multipart', # Hyperlink settings 'URL_FORMAT_OVERRIDE': 'format', 'FORMAT_SUFFIX_KWARG': 'format', 'URL_FIELD_NAME': 'url', # Encoding 'UNICODE_JSON': True, 'COMPACT_JSON': True, 'STRICT_JSON': True, 'COERCE_DECIMAL_TO_STRING': True, 'UPLOADED_FILES_USE_URL': True, # Browseable API 'HTML_SELECT_CUTOFF': 1000, 'HTML_SELECT_CUTOFF_TEXT': "More than {count} items...", # Schemas 'SCHEMA_COERCE_PATH_PK': True, 'SCHEMA_COERCE_METHOD_NAMES': { 'retrieve': 'read', 'destroy': 'delete' }, }

      

    创建 user/serlizers.py 写序列化器

     

    def validata_address(self,data):
    
        if data=='测试':
            raise serializers.ValidationError('请重新填写地址') # 有错就抛出异常
        return data # 没错就返回结果
    def validate_phone(self,data):
        # 不符合手机格式
        # raise serializer.ValidationError('手机号格式不正确')
        model=self.root.Meta.model
        num=model.object.filter(phone=data).count()
        if num>0:
            raise serializers.ValidationError('已存在手机号')
        return data
    # 3 所有属性验证
    def validate(self,attrs):
        # attrs:{"username":"zhangsan","phone":"110",}
        # 所有属性 验证器
        #self.context 中有request 和views 上下文
        #self.context['view'].action 跨域取到动作
        # attrs 是需要序列化数据 
        # raise serializers.ValidationError('xxx错误')
        return attrs # 没问题返回数据
    class Meta:
        model=User
        fields='__all__'
        read_only_fields=('',)
        extra_kawargs={
            'address':{
                'min_length':5, # 给地址增加 最小长度 限制
                'default':'默认测试地址' #增加默认值
            }
        }  

    在 views 写入

    from django.shortcuts import render
    
    from django.http import HttpResponse
    from django_filters.rest_framework import DjangoFilterBackend
    from rest_framework import viewsets
    from rest_framework.authentication import BasicAuthentication,SessionAuthentication
    from rest_framework.decorators import action
    from rest_framework.filters import OrderingFilter
    from rest_framework.permissions import AllowAny,IsAdminUser,IsAuthenticated,IsAuthenticatedOrReadOnly
    from rest_framework.response import Response
    from rest_framework.throttling import UserRateThrottle
    from rest_framework.pagination import PageNumberPagination
    from rest_framework.views import APIView
    from rest_framework.permissions import BasePermission,SAFE_METHODS
    from user.models import User
    from user.serializers import UserSerlizer,UserUnActiveSerializer
    
    def index(request):
    # 需要认证才能访问的视图
    return HttpResponse('hello')
    class PageNum(PageNumberPagination):
    # 查询字符串中代表每页返回数据数量的参数名,默认值为:None
    page_size_query_param = 'page_size'
    # 查询字符串中代表页码的参数名,默认值为:page
    #page_query_param='page_size'
    max_page_size = 2
    class MyPermissio(BasePermission):
    def has_permission(self, request, view):
        print(view.kwargs.get('pk'),request.user.id)
        '''判断用户对使用次权限类的视图都有权限'''
        # 任何用户对使用次权限的视图都要访问权限
        print(request)
        if request.user.is_superuser:
        # 管理员对用户模型具有访问权
            return True
        elif view.kwargs.get('pk')==str(request.user.id):
            return True
        return False
    
    class UserViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerlizer
        pagination_class = PageNum
        # 限流自定义
        throttle_classes = [UserRateThrottle]
        # 指定过滤方法
        filter_backends = (DjangoFilterBackend,OrderingFilter)
        ordering_fields=('data_joined','id')
        filter_fields=('username','phone','is_active')
      def get_serializer_class(self):
            return UserSerializers
    

    urls.py

    from django.contrib import admin
    from django.urls import include,path
    from user import views
    from rest_framework.routers import SimpleRouter,DefaultRouter
    '''
    自动生成路由方法 必须用视图集
    routed=DefaultRouter() 没有跟路由 /user/ 无法识别
    '''
    routed=DefaultRouter()
    routed.register(r'user',views.UserViewSet)
    urlpatterns = [
        path('index', views.index),
        path('api-auth/',include('rest_framework.urls',namespace='rest_framework')) # 认证地址
    ]
    
    urlpatterns+=routed.urls
    

      

  • 相关阅读:
    xls与csv文件的区别
    青音,经典爱情语录
    win7用户账户自动登录方法汇总
    How to using Procedure found Lead Blocker
    FTS(3) BSD 库函数手册 遍历文件夹(二)
    FTS(3) BSD 库函数手册 遍历文件夹(一)
    DisplayMetrics类 获取手机显示屏的基本信息 包括尺寸、密度、字体缩放等信息
    About App Distribution 关于应用发布
    FTS(3) 遍历文件夹实例
    OpenCV 2.1.0 with Visual Studio 2008
  • 原文地址:https://www.cnblogs.com/zhangshijiezsj/p/13799048.html
Copyright © 2011-2022 走看看