Django开发流程(pip虚拟环境)

创建虚拟环境

# 新建文件夹vision
# 进入vision文件夹,使用以下命令安装虚拟环境
python -m venv venv
# 进入虚拟环境(windows)
# 在项目根目录创建文件(activate_venv.bat),输入以下内容
@echo off
REM 打开新的 PowerShell 并激活虚拟环境
powershell -NoExit -ExecutionPolicy Bypass -Command "venv\Scripts\Activate.ps1"
# 在cmd里运行该文件:
.\activate_venv.bat
# 进入虚拟环境(Linux/MacOs)
source venv/bin/activate
# 退出虚拟环境
deactivate

安装django和依赖管理

# 安装Django
pip install django
# 安装mysql
pip install mysqlclient
# 创建项目
django-admin startproject mysite .# 注意末尾的 . 表示在 当前目录 创建项目,而不是生成一个新的 vision/ 文件夹。
# 更新依赖清单:
pip freeze > requirements.txt
# 下次运行脚本:
pip install -r requirements.txt

创建项目里的app

# 创建web app
python manage.py startapp web
# 创建admins app
python manage.py startapp admins
# 在根目录的vision目录的settings.py里的INSTALLED_APPS数组添加内容:
INSTALLED_APPS = [
    'django.contrib.admin',
     ...
    'web',
    'admins',
]

# 修改支持语言和时区
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

# 修改数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 不变
        'NAME': 'your_db_name',
        'USER': 'your_db_user',
        'PASSWORD': 'your_password',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},  # 避免中文乱码
    }
}

查看django项目是否创建成功

# 输入以下命令:
python manage.py runserver # 浏览器打开http://127.0.0.1:8000,出现django页面表示成功

生成数据库对应的model文件

# 使用django自带的命令(django需要mysql>8.0.11)
python manage.py inspectdb tbl_user > web/models_auto.py

设置路由

# 在app的目录下(比如web)的urls.py写入以下内容(如果没有该文件,新建一个):
urlpatterns = [
    path('', index, name='index'),
    path('login/', login, name='login'),
]
# 在 site目录下(比如vision)的urls.py写入以下内容:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('web.urls')),  # 把 web app 的路由包含进来
]

设置session

# 登录时设置session和cookie
# 登录成功,自己写 session
request.session["user_id"] = user.id
# 设置 cookie
response = JsonResponse({"code": "200", "msg": "登录成功"})
response.set_cookie("username", user.username, max_age=7*24*60*60)  # 有效期 7 天
return response
# setting.py里写
# session 有效期 7 天(单位秒)
SESSION_COOKIE_AGE = 7 * 24 * 60 * 60  

# 用户关闭浏览器是否清除 session
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # False:关闭浏览器不清除,True:关闭浏览器清除

# Session 存储方式(默认数据库)
SESSION_ENGINE = "django.contrib.sessions.backends.db"

# Cookie 名字
SESSION_COOKIE_NAME = "sessionid"  # 可以改成 'web_session' 之类的

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'web.middleware.AuthMiddleware',  # 你自己写的中间件
]
# 在app目录里新建middleware.py文件,写入以下内容
from django.shortcuts import redirect

from django.shortcuts import redirect

class AuthMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 白名单(不需要登录的路径)
        white_list = ["/", "/login/", "/register/"]

        if request.path not in white_list:
            user_id = request.session.get("user_id")
            if not user_id:  # 没登录或session过期
                return redirect("/")

        return self.get_response(request)

# 后端读取session
user_id = request.session.get("user_id")

# 前端读取cookie
function getCookie(name) {
    let cookieArr = document.cookie.split(";"); // 拆分所有 cookie
    for(let i = 0; i < cookieArr.length; i++) {
        let cookiePair = cookieArr[i].trim().split("=");
        if(cookiePair[0] === name) {
            return decodeURIComponent(cookiePair[1]);
        }
   }
   return null;
}
# 使用
let username = getCookie("username");
if(username) {
    document.getElementById("username").innerText = username;
}

.gitignore文件内容

# Python
*.pyc
*.pyo
*.pyd
__pycache__/
*.env

# 虚拟环境
venv/
ENV/
env/

# Django
*.sqlite3
db.sqlite3
*.log

# IDE / 编辑器
.vscode/
.idea/
*.swp
*.swo

# 系统文件
.DS_Store
Thumbs.db

# PyInstaller 打包输出
dist/
build/
*.spec

# 其他缓存 / 临时文件
*.egg-info/
上一篇
下一篇