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