Django使用技巧

1.在你不需要返回任何数据的情况下,你可以直接返回状态码

状态码为200时仍会跳转,但204不会
HttpResponse(status=204)
204 No Content 表示服务器成功处理了请求,但不需要返回任何实体内容

2.request的部分方法

request.method:获取请求类型

if request.method == 'POST':

request.POST['title']:获取上传的对应值
request.body:获取上传的数据。如字典之类的所有类型数据
request.FILES.get("pic",None):获取上传的文件,失败则返回None

<!-- 要发送到的地址,发送方式(图片必须是post) -->
<form action="{% url 'doupload' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    标题名称:<input type="text" name="title"><br><br>
    上传文件:<input type="file" name="pic"><br><br>
    <input type="submit" value="上传">
</form>

3.Ubuntu 设置环境变量保护 Django 数据库密码

🧠 一、为什么要用环境变量

把数据库密码写死在代码里(比如 'PASSWORD': 'root')是不安全的。
通过环境变量,你可以:

  • 避免把密码上传到 Git 仓库;
  • 根据不同环境(开发 / 生产)灵活切换配置;
  • 让服务器上的敏感信息隐藏在系统层。

⚙️ 二、设置环境变量的方法

✅ 方法 1:临时设置(只在当前终端有效)

export DJANGO_MYSQL_PASSWORD='MyStrongPassword123'

查看是否成功:

echo $DJANGO_MYSQL_PASSWORD

运行你的 Django 程序时,它就能通过:

os.environ.get('DJANGO_MYSQL_PASSWORD')

拿到这个值。

⚠️ 关闭终端后,这个设置会失效。


✅ 方法 2:永久设置(系统级)

如果你希望每次开机或登录都生效,可以写入你的 Shell 启动文件。

修改文件:

nano ~/.bashrc

在文件末尾添加:

export DJANGO_MYSQL_PASSWORD='MyStrongPassword123'

保存并使其生效:

source ~/.bashrc

✅ 方法 3:为 Django 专门配置 .env 文件(推荐)

在项目根目录创建一个文件:

.env

内容:

DJANGO_MYSQL_PASSWORD=MyStrongPassword123

然后在 settings.py 中加载它:

from dotenv import load_dotenv
import os

load_dotenv()  # 从 .env 文件加载环境变量

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'root',
        'PASSWORD': os.environ.get('DJANGO_MYSQL_PASSWORD'),
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

⚠️ 并且在 .gitignore 里加上 .env,防止密码被上传到 Git。


🧱 三、验证是否生效

python manage.py shell

进入后输入:

import os
print(os.environ.get('DJANGO_MYSQL_PASSWORD'))

若输出你的密码字符串,就说明环境变量已成功加载 ✅


🔐 四、小结

方法 是否持久 是否推荐 适用场景
export ... ❌ 临时 🟡 临时测试
.bashrc ✅ 永久 🟢 开发环境
.env + python-dotenv ✅ 最推荐 🟢 Django/Flask 项目部署

4.生产环境配置:Django 关闭 DEBUG 后如何正常加载 CSS/JS 等静态资源


一、问题原因

DEBUG=True 时:

Django 的开发服务器会自动帮你找 /static/ 的文件。

但当 DEBUG=False 时:

Django 不会再帮你托管静态资源,必须你额外配置静态文件服务(如 Nginx 或 WhiteNoise)。


二、方案 1:使用 WhiteNoise(最简单、安全)

1️⃣ 安装 WhiteNoise

pip install whitenoise

2️⃣ 修改 settings.py

MIDDLEWARE加在 SecurityMiddleware 后面

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # 必须紧跟其后
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
]

3️⃣ 配置静态文件路径

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic')

4️⃣ 收集静态文件

python manage.py collectstatic

将所有静态文件复制到 collectedstatic/ 目录。

5️⃣ 启动服务并访问

python manage.py runserver

即使 DEBUG=False,静态资源也会被 WhiteNoise 自动加载。

6️⃣ 可选优化

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

可以开启 gzip 压缩与缓存。


三、方案 2:使用 Nginx 托管静态文件(生产环境推荐)

1️⃣ 执行静态收集

python manage.py collectstatic

生成目录 /home/youruser/webProject/DjangoBlog/collectedstatic

2️⃣ 配置 Nginx

server {
    listen 80;
    server_name example.com;

    location /static/ {
        alias /home/youruser/webProject/DjangoBlog/collectedstatic/;
    }

    location /media/ {
        alias /home/youruser/webProject/DjangoBlog/uploads/;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

3️⃣ 重新加载 Nginx

sudo systemctl reload nginx

四、检查静态文件路径

模板中引用静态文件应使用 {% static %} 标签:

{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">

五、验证方法

  1. 设置 DEBUG=False
  2. 运行:
python manage.py collectstatic
python manage.py runserver
  1. 打开网页,查看 /static/ 资源是否加载成功
    如果仍然 404,请检查浏览器开发者工具 → Network → 静态资源路径。

六、总结

环境 推荐方案 优点
本地开发 / 小项目 WhiteNoise 免 Nginx,配置简单
云服务器 / 生产部署 Nginx 静态托管 性能高,可缓存,可配 CDN

5.Django 中将输出信息记录到 info 日志而非 print

在 Django 中,如果想把信息输出到日志或“info”层级,而不是简单使用 print(),应使用 Python 的 logging 模块。Django 默认集成了这个机制,可方便地输出不同日志级别(debuginfowarningerrorcritical)。


1. 引入 logging

import logging

# 获取当前模块的 logger
logger = logging.getLogger(__name__)

2. 使用 info 级别记录信息

def my_view(request):
    # 普通输出
    logger.info("这是 info 级别的日志")

    # 输出变量
    user_id = 123
    logger.info("当前用户 ID: %s", user_id)

    return HttpResponse("日志已记录")

注意:推荐使用 , 或 f-string,而不是字符串拼接 "当前用户ID: " + str(user_id),因为 logging 在低于级别时可以避免执行拼接,提高性能。


3. 配置 Django 日志(可选)

settings.py 中配置日志,例如:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {message}',
            'style': '{',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
        },
        'myapp': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        },
    },
}

这样所有 logger.info() 输出的信息就会出现在控制台或指定的 handler 中,而不是直接用 print()


4. 小结

  • 不要用 print(),它只能输出到控制台,且无法区分级别。
  • logging.getLogger(__name__) 获取 logger,再用 .info()/.debug()/.error() 输出。
  • Django 的日志系统可配置不同级别和输出目标。

6.web服务有大量的依赖IO操作的调用,比如磁盘文件、数据库、远程api。所以可以采用多线程(线程池)的方式来加速读写

使用线程池的好处:

  1. 方便的将磁盘文件、数据库、远程api的I/O调用并发执行
  2. 线程池的线程数不会无限创建(导致系统挂掉),具有防御功能。

7.Django 自带哈希函数使用指南

Django 自带了安全可靠的哈希函数工具,主要位于模块:

from django.contrib.auth.hashers import *

这些工具是 Django 用户认证系统(django.contrib.auth)内部使用的同一套加密方案,非常适合在项目中手动处理密码、令牌等安全哈希需求。


一、常用哈希函数与用法

1. 生成哈希

from django.contrib.auth.hashers import make_password

hashed = make_password('mysecretpassword')
print(hashed)
# pbkdf2_sha256$600000$9JdA0RJjRVytXZQmpj3iOv$2sXMCwqD2DP2...

说明:

  • make_password() 会自动选择默认算法(通常是 PBKDF2 + SHA256)。
  • 哈希字符串中包含算法名、迭代次数和盐(salt),无需自己额外存储。

可选参数:

make_password(password, salt=None, hasher='default')

例如:

make_password('123456', salt='mysalt', hasher='pbkdf2_sha256')

2. 验证密码是否匹配

from django.contrib.auth.hashers import check_password

password = 'mysecretpassword'
hashed = make_password(password)

#check_password(明文密码,加密后的密码) return True/False
check_password('mysecretpassword', hashed)  # True
check_password('wrongpass', hashed)         # False

3. 使用指定算法生成哈希

Django 内置多种算法:

from django.contrib.auth.hashers import make_password, get_hasher

print(get_hasher('pbkdf2_sha256'))
print(get_hasher('argon2'))  # 若启用了 argon2

常见算法:

  • pbkdf2_sha256(默认)
  • pbkdf2_sha1
  • bcrypt
  • argon2(需安装 argon2-cffi)

例如使用 bcrypt:

make_password('mypassword', hasher='bcrypt')

二、自定义密码哈希设置(settings.py)

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]

三、在 Django shell 中测试

python manage.py shell
from django.contrib.auth.hashers import make_password, check_password

hashed = make_password('admin123')
print(hashed)
check_password('admin123', hashed)

四、应用场景

场景 推荐函数 说明
用户密码存储 make_password() / check_password() 安全、可升级算法
API Token 哈希 make_password() 防止明文泄漏
临时验证码或密钥验证 make_password() + check_password() 不可逆验证方式

五、与普通哈希函数区别

Django 哈希 普通哈希(如 hashlib)
自动加盐 无自动加盐
多重迭代抗暴力破解 单次哈希
支持算法升级 固定算法
可直接验证 需手动比对

8.单独测试某个函数

要在文件头先初始化Django环境,不然会报错。

✅ 前提是:test.py 位于 Django 项目的根目录(能 import noteWeb.settings)。

import os
import django

# 设置 Django 项目的配置模块路径(修改为你的项目 settings 路径)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'noteWeb.settings')
django.setup()

#测试哈希函数
from django.contrib.auth.hashers import make_password, check_password

hashed = make_password('mysecretpassword')
print(hashed)

9.报错:没有安装数据库依赖:详见《Django使用教程》中的三、模型层

10.升级为https后可能会出现csrf验证报错

解决方法:
settings.py中加入以下配置

# django 4.0新增配置
CSRF_TRUSTED_ORIGINS = ['https://primordialblog.publicnote.top',]

域名换成自己的,注意一定要是https

然后把旧的Cookie清除掉(旧的Cookie可能影响访问),然后再重新访问

11.使用SimpleUI来优化Django默认的admin页面

SimpleUI = 一个 Django Admin 的前端主题(Theme / 皮肤)

1.安装Django+Simple

安装Django

pip install django

安装Simple

方式1:pip直接安装

pip install simpleui

注:因为作者传的pypi包有问题,本人于2025.11.30未能安装成功

方式2:从git拉取(可能需要魔法网络)

pip install git+https://github.com/newpanjing/simpleui.git

方式3:从git上下载压缩包,并pip安装

  1. git地址直接下载压缩包。

  2. 解压压缩包(以Ubuntu系统为例)

unzip simpleui-master.zip
  1. 进入目录,并安装
cd simpleui-master
pip install .

方法4:从git上下载压缩包,并直接引入

  1. 按照方法3解压后会得到目录simpleui-master/simpleui/
  2. simpleui 文件夹放到你的项目目录:
your_project/
    simpleui/   ← 手动放进来
    manage.py
    yourapp/
  1. 然后在 settings.py
INSTALLED_APPS = [
    'simpleui',
    ...
]

2.新建一个django项目

django-admin startproject mysite
cd mysite

3.新建一个app

python manage.py startapp blog

4.在 settings.py 注册 SimpleUI

mysite/settings.py

INSTALLED_APPS = [
    'simpleui',  # 必须放最前
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',  # 你的 App
]

5.配置语言为中文(可选)

mysite/settings.py

# 找到以下这几个变量,并修改为以下值
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = False

6.创建一个管理员账户

python manage.py migrate
python manage.py createsuperuser

7.启动服务并访问admin

python manage.py runserver

访问localhost:8000/admin

posted @ 2026-07-02 18:04  畅畅c  阅读(1)  评论(0)    收藏  举报