[技术博客]二食堂很难排队后端技术文档-用户部分

综合介绍

这次我们的小组的项目是制作一个网页,允许多人同时标注文档中的实体和关系,并展示其组成的思维导图,此外还提供实体关系以及实体关系三元组的json文档下载以供人工智能训练用
我在项目中负责的是后端的,用户部分,包括用户创建、用户信息修改、登录登出、好友系统和共同标注部分。
我们项目后端使用的是Django,一种基于python的网页框架。因为基于python,且很多基础功能有封装,所以其编写非常方便,效率方面暂时没有出现什么弊端。就目前表现来说是个非常好的网页框架。

功能部分

首先Django以应用app划分服务器上的功能,先使用如下指令创建应用

python manage.py startapp 应用名

之后会创建一个名称为应用名的目录,其结构如下

    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

其中admin、apps、migration是一些基础功能的文件,就我实现的功能而言,尚未用到这些,所以暂不涉及。主要就两个文件 models.pyviews.py前者是存放使用的对象的结构的文件,后者是默认的功能的文件,当然也可以创建新的文件再在里面编写功能。推荐不同的功能的代码单独的放在各自的文件中,而不是全部放在view.py中,方便管理。

展示网页

可以使用render函数发回HTML的网页,具体代码如下

from django.shortcuts import render
def showIndex(request):
    return render(request, template_name='textMark/index.html')

其中request是接受的请求template_name对应的是文件名,html文件要放在项目根目录下的templates目录下,而html文件所使用的css文件和js文件要放在根目录下的static目录下

url路径

根目录下有个跟项目同名的目录,里面有个url.py的文件,这是总页面的url路径索引,其中

urlpatterns = [
path('index/', showIndex),
]

其中path就是用来关联url路径和处理的函数,第一个参数是对应的url路径,第二个参数是处理请求的函数,此外还有可以使用include()函数将剩余的url转到到应用目录下的的url.py的子路由表,进行处理,如下所示

path('api/project/', include('project.urls')),

使用多级url逐级分发,既可以避免大量的url在一个文件夹下,难以管理,又可以使各部分独立运行,让项目脱耦,便于开发。

用户对象部分

首先在根目录下使用指令python manage.py migrate创建数据库
Django后端默认使用的是sqlite的数据库,在modle.py文件中创建对应的类,

from django.db import models

class Customer(models.Model):
name = models.CharField(max_length=200)

这样子创建一个继承自django.db.models.Model的类,name是其中的属性,models.CharField是属性的类型,这是一个字符类型的属性,max_length=200表示该属性最大的长度为200,其他还有很多不同的属性类别,具体可参考官方文档
如果想创建用户类型可以继承django.contrib.auth.modelsUser类,如果想只是保留最基础的username,password,id属性,可以继承AbstractUser这个抽象user类,然后其中的很多函数就可以自定义,比如登录等。

class big_user(AbstractUser):
    name = models.CharField(max_length=40)

创建完用户类后在根目录下使用python manage.py makemigrations 应用名的指令生成更新脚本对数据库进行更新。

用户操作

因为继承的是用户类,可以直接使用继承的create_user函数来创建一个新的用户,保存其usernamepassword,用户名和密码,使用这个函数创建用户对象,数据库中的密码会加密存储。创建后可以得到一个新的用户对象,之后使用用户对象的.save()函数将新创建的用户对象保存到数据库中,其他的修改用户对象的属性等操作完成后也要调用这个函数保存修改。
验证用户名和密码的时候使用authenticate(username=, password=)对用户名和密码进行验证,如果用户名和密码相匹配则这个函数返回对应的用户对象,否则返回None,使用django.contrib.auth.login(user, request)函数登录用户,产生对应的session放入request当中。登出的时候使用django.contrib.auth.logout(request),logout函数没有返回值。
根据用户名查找用户的时候可以使用big_user.objects.get(username=user_name)的指令查找对应用户。

session

上文说到session是生成一个存放用户结构等的session结构,在request中是一个基于用户对象字符串,Django有自带的session引擎,会自动将将request中的session关联上user,可以使用request.user直接根据request提取session对应的user对象,来快速得到对应的用户对象,而不需要手动查找和将username放到request中进行传输,也可以用来验证登录。

原文地址:https://www.cnblogs.com/hunry6th/p/12961753.html