本质上来讲,不管是轻量级的flask,还是稍微复杂一些的django,都是一种对于socket通信的封装,它们都是使用socket通信实现服务器和用户之间的交互。
django是一种典型的MVC框架,即将应用分为了三部分:model(模型)、view(视图)、controller(控制器),下面从这三部分依次对django进行讲解。
模型负责业务对象和数据库对象。这是一个相对抽象的描述方式,django使用自己的方式定义了一套数据库的操作,包括数据表的创建、修改以及数据的增删改查。不管底层使用的是哪种类型的数据库,用户只需要掌握了django的这么一套模式,就可以以不变应万变。
模型的创建:
class TbTrainContent(models.Model):
""" 存放训练信息的模型 """
# 训练数据id
train_data_id = models.AutoField(primary_key=True)
# 制度id
law = models.ForeignKey(TbDocContent, on_delete=models.CASCADE)
# 制度条例
law_content = models.CharField(max_length=10000)
# 查询内容
question_des = models.CharField(max_length=10000)
# 标签,正类 负类 0:负类 即制度条例和查询内容无关 1:正类 即制度条例和查询内容有关
label = models.CharField(max_length=10)
# 插入时间
insert_time = models.DateTimeField()
# 是否已经被使用,这里是在检查更新的时候用到,取0或者1 0:未被使用 1:已经被用过了
is_used = models.CharField(max_length=10, default=0)
class Meta:
unique_together = ['law', 'hash_question_des', 'label']
数据的插入:
tb_train_content = TbTrainContent(law_id=sel_law_id_all[last_index],
law_content=sel_law_all[last_index],
hash_question_des=has_question,
question_des=question_desc,
label='0',
insert_time=time.strftime('%Y-%m-%d %I:%M:%S'),
is_used='0')
# 保存数据
tb_train_content.save()
视图用于生成用户能够看到的内容,在django中使用view函数来实现。view函数根据用户传递进来的参数进行不同的操作,进而返回相应的数据给用户。下面是一个更新表的视图函数:
def update_org_code(request):
""" 更新机构码上传时间 :param request: :return: """
# 记录制度的更新时间
upload_time = time.strftime('%Y-%m-%d %I:%M:%S')
org_code = request.GET['org_code']
tb_file_upload_time = TbFileUploadTime(org_code=org_code, update_time=upload_time)
tb_file_upload_time.save()
ps = []
for i in range(3):
p = Thread(target=QueryLaw.update_cache, args=(org_code, i))
ps.append(p)
for p in ps:
p.start()
return HttpResponse('update org_code %s success' % org_code)
控制器是连接用户和视图之间的纽带,根据用户请求地址为其分配相应的视图函数。
urlpatterns = [
path('admin/', admin.site.urls),
path('search/', search),
path('feedback/', get_user_feedback),
path('update_org_code/', update_org_code),
path('upload_file/', upload_file),
path('upload_law/', upload_law),
]