zoukankan      html  css  js  c++  java
  • Django-前后端分离

    新建一个子项目testcase

     在Django里新建一个子项目testcase,新建的项目需要在settings.py->INSTALLED_APPS里增加子项目的名字,即'testcase',否则后续建表的时候是找不到这个子项目的,也会生效。

    建表时不同的表之间都会有一些公共的字段,如果建表的时候每个类里的都写一遍很麻烦,此时我们可以把公共的字段抽离出来写一个父类,其余表在使用的时候继承即可。需要注意的是父类这个表在建表时是不应该被创建的,所以需要有一个特殊的声明。详情见例子

    建表时,多对多关系的两张表在django里是通过创建第三张表来实现的多对多关系的,

    class BaseModel(models.Model):  #父类
        create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
        update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
        is_delete = models.BooleanField(verbose_name='是否删除', default=False) #default=False表示删除的时候不会真的被删除,会被标记false
        class Meta:
            abstract = True #声明这个类只是用来继承的,不会创建这张表
    
    class CaseSet(BaseModel):  #继承父类
        name = models.CharField(verbose_name='集合名称',max_length=60)
        desc = models.CharField(verbose_name='集合描述',max_length=70)
    
    
        def __str__(self):
            return self.name
    
        class Meta:
            db_table = 'case_set'
            verbose_name ='用例集合表'
            verbose_name_plural = verbose_name
    class Case(BaseModel):  #用例表
    title = models.CharField(verbose_name='用例标题',max_length=80,db_index=True,unique=True)
    desc = models.CharField(verbose_name='用例描述',max_length=120)
    method_choice = [
    [0,'get'],
    [1,'post'],
    [2,'put'],
    [3,'delete'],
    ]
    method = models.SmallIntegerField(choices=method_choice,verbose_name='请求方式',default=0)
    url = models.URLField(max_length=50,verbose_name='请求url')
    params = models.TextField(verbose_name='请求参数')
    run_count = models.IntegerField(verbose_name='运行次数',default=0,null=True,blank=True)
    run_time = models.DateTimeField(verbose_name='运行时间',null=True,blank=True)
    case_set = models.ManyToManyField(CaseSet,db_constraint=False,verbose_name='用例集合',null=True,blank=True)
        #ManyToManyField表示多对多关系,case与case_set表是多对多关系,上面这一行实际会创建出第三张表来记录多对多关系。
        def __str__(self):
    return self.title

    class Meta:
    db_table = 'case'
    verbose_name ='用例表'
    verbose_name_plural = verbose_name

    前后端分离的项目后端返回的结果就不能用render了,要返回json串,需要导入from django.http import JsonResponse

    多个子项目时如何管理url?

    一个项目里有多个子项目,如果把所有的url都配置在django项目下的urls.py里会比较乱,这时我们可以在每一个子项目里单独创建一个urls.py文件,用于单独配置每个项目的url,只需在django项目里总的urls.py里把子项目的url配置进去即可。

     Django里的参数校验form

    导入:from django import forms

    form校验通过够会返回一个字典,在使用字典数据时用**form.cleaned_data

    form里可以自定义校验规则,例如校验methon字段,要以clean开头,即def clean_method,这属于校验单个字段,如果要校验多个字段,直接def clean

     方法一:

    # form 校验请求参数
    class CaseForm(forms.Form):
        """校验请求参数"""
        title = forms.CharField(max_length=50, min_length=2)
        desc = forms.CharField(max_length=60, required=False)
        method = forms.IntegerField()  # 0 1 2 3
        url = forms.URLField()
        params = forms.CharField(max_length=100)
    
        def clean_title(self):  # 校验单个字段
            title = self.cleaned_data.get('title')
            if models.Case.objects.filter(title=title).count() > 0:
                raise ValidationError('用例标题已经存在') #抛出一个异常,代码不会再往下走
            return title
    
        def clean(self):  # 校验多个字段
            title = self.cleaned_data.get('title')
            method = self.cleaned_data.get('method')
    
    引用的时候:
    class CaseView(View):
        def post(self, request):
            form = CaseForm(request.POST)
            if form.is_valid():
                print('这是用了form校验的')
                models.Case.objects.create(**form.cleaned_data)
                data = {'code': 0, 'msg': '添加成功'}
    
            else:
                print(form.errors.as_data())
                data = {'code': -1, 'msg': '参数错误'}
    
            return JsonResponse(data)

    方法二:这种和数据库有关系的校验还有一种简便的方法

    class CaseForm2(forms.ModelForm):
        class Meta:
            # fields = '__all__' #代表所有字段
            # fields=['method','url'] #代表校验这两个字段
            exclude=['case_set'] #排除某个字段
            model = models.Case #指关联哪张表
    
    引用的时候:
    class CaseView(View):
        def post(self, request):
            form = CaseForm2(request.POST)
            if form.is_valid():
                print('这是用了form校验的')
                form.save() #save方法就是直接连数据库保存,同下面一行,方法二才可以这么写
                #models.Case.objects.create(**form.cleaned_data)  #手动找到这张表进行操作,把检验通过的数据插入到表里
                data = {'code': 0, 'msg': '添加成功'}
    
            else:
                print(form.errors.as_data())
                data = {'code': -1, 'msg': '参数错误'}
    
            return JsonResponse(data)

    自定义返回类型

    from django.http import JsonResponse
    
    def NbResponse(code=0,msg='操作成功',**kwargs):
        response = {'code':code,'msg':msg}
        response.update(kwargs)
        return JsonResponse(response,json_dumps_params={'ensure_ascii': False})

    如果不知道数据库表的信息,可通过下方命令将数据库的表生成到model1.py文件中,就不需要自己在写了,这种方法只会生成单张表,如果表和表之间有关联关系,需自己手动关联。

    python manage.py inspectdb > model1.py

    Django如何连接redis

    在settings.py中配置如下内容

    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://118.23.3.41:6399/0",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100},
                "PASSWORD": "666667&*",  # 密码
            }
        },
        "redis2": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100, 'decode_responses': True},
                "PASSWORD": "123456",  # 密码
            }
        }
    }  # redis配置



  • 相关阅读:
    Python全栈之路系列----之-----并发编程Process类
    Python全栈之路系列----之-----网络编程(粘包与命令执行/数据传输)
    Python全栈之路系列----之-----网络编程(套接字)
    Python全栈之路系列----之-----面向对象5(封装/访问限制)
    Python全栈之路系列----之-----面向对象2(命名空间/组合)
    6. EF Core 数据库实体关系外键的配置
    5.EF Core 数据库映射模型隐藏属性配置
    4.EF Core 数据库映射模型基本配置
    3.EF Core 隐射表的几种默认约束
    2.EF Core添加数据库配置的几种方式
  • 原文地址:https://www.cnblogs.com/tata-learning/p/12216046.html
Copyright © 2011-2022 走看看