Django项目搭建

136 阅读2分钟

1.使用命令行生成Django项目

django-admin startproject mysite // mysite 项目名称

2.创建项目虚拟环境

// cd 到相关目录下
virtualenv venv


// 进入当前虚拟环境 (激活)
source venv/bin/activate

// 离开当前虚拟环境
deactivate

3.生成requirements.txt文件

pip3 freeze >requirements.txt



// 拉取requirements.txt文件的包
pip3 install -r requirements.txt

4.创建app

// 新建APP
python3 manage.py startapp polls

// 激活应用,setting文件中
INSTALLED_APPS = [    'django.contrib.admin',      'django.contrib.auth',      'django.contrib.contenttypes',      'django.contrib.sessions',      'django.contrib.messages',      'django.contrib.staticfiles',      'myApp'  ]

配置数据库

// 做好本地环境、测试环境与正式环境的区分

class mysql_environment(Enum):
    local = 0
    test = 1
    formal = 2

class mysql_name(Enum):
    '''
    # 数据库名,本地"plan_wall",测试"plan_wall_test"
    '''
    local = 'plan_wall'
    test = 'plan_wall_test'
    formal = ''

class mysql_user(Enum):
    '''
    # 用户名,本地"root",测试"test_plan"
    '''
    local = 'root'
    test = 'test_plan'
    formal = ''

class mysql_pswd(Enum):
    '''
    # 数据库密码 本地"",线上"",测试""
    '''
    local = ''
    test = ''
    formal = ''
    
// 每次只需要更改这个数值就行
environment = mysql_environment.local

# mysql环境
MYSQL_ENV = environment

if MYSQL_ENV == mysql_environment.local:
    sql_name = mysql_name.local.value
    sql_user = mysql_user.local.value
    sql_pswd = mysql_pswd.local.value
elif MYSQL_ENV == mysql_environment.test:
    sql_name = mysql_name.test.value
    sql_user = mysql_user.test.value
    sql_pswd = mysql_pswd.test.value
else:
    sql_name = mysql_name.formal.value
    sql_user = mysql_user.formal.value
    sql_pswd = mysql_pswd.formal.value


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': str(sql_name),
        'USER': str(sql_user),
        'PASSWORD': str(sql_pswd),
        'HOST':'localhost', # 数据库服务器ip
        'PORT':'3306', # 端口
        'OPTIONS': {'charset':'utf8mb4'}, #支持emoji
    }
}

// 配置mysql, pymysql
// 在__init__.py 文件中写入两行代码
# 指定版本信息

import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

4.配置路由

# myApp的urls中

from django.urls import path, include

urlpatterns = [  
    path('admin/', admin.site.urls),  
    path('login/', include('apps.login.urls'))  
]

# login.urls
from django.urls import path
from . import views
urlpatterns = [
    path('v1/register', views.UserRegister.as_view()),
]

5.创建模型

class UserInfo(models.Model):

    avatar = models.CharField(max_length=256, verbose_name='头像', default='', null=True, blank=True)
    username = models.CharField(max_length=32, verbose_name='用户名', default='', null=True, blank=True)
    password = models.CharField(max_length=64, verbose_name='密码')
    phone_number = models.CharField(max_length=32, verbose_name='手机号', default='', null=True,blank=True)
    email = models.CharField(max_length=32, verbose_name='邮箱', default='', null=True, blank=True)
    create_time = models.DateTimeField('注册时间', auto_now_add=True)
    internal = models.IntegerField(default=1)
    is_delete = models.IntegerField(default=0)

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = verbose_name


class UserToken(models.Model):
    user = models.OneToOneField(to='UserInfo', on_delete=models.CASCADE)
    token = models.CharField(max_length=64)

    class Meta:
        verbose_name = '用户token'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.token

6.迁移数据库

#模型存储为一次迁移
python3 manage.py makemigrations
#模型迁移
python3 manage.py migrate

7.运行项目

python3 manage.py runserver

8.设置认证权限

from apps.login.models import UserToken
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions


class Authtication(BaseAuthentication):
    def authenticate(self, request):
        token = request.data.get('token')
        token_obj = UserToken.objects.filter(token=token).first()
        if not token_obj:
            raise exceptions.AuthenticationFailed('用户认证失败')
        # 在rest_framework 内部会将两个字段赋值给request,以供后续使用 request.user request.auth
        return (token_obj.user, token_obj)

    def authenticate_header(self, request):
        pass