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配置

 

 

 

 

 

 

 

 

 

 

 

 

 

 




posted @ 2020-01-19 23:46  塔塔~  阅读(983)  评论(0编辑  收藏  举报