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' %}">
五、验证方法
- 设置
DEBUG=False - 运行:
python manage.py collectstatic
python manage.py runserver
- 打开网页,查看
/static/资源是否加载成功
如果仍然 404,请检查浏览器开发者工具 → Network → 静态资源路径。
六、总结
| 环境 | 推荐方案 | 优点 |
|---|---|---|
| 本地开发 / 小项目 | WhiteNoise | 免 Nginx,配置简单 |
| 云服务器 / 生产部署 | Nginx 静态托管 | 性能高,可缓存,可配 CDN |
5.Django 中将输出信息记录到 info 日志而非 print
在 Django 中,如果想把信息输出到日志或“info”层级,而不是简单使用 print(),应使用 Python 的 logging 模块。Django 默认集成了这个机制,可方便地输出不同日志级别(debug、info、warning、error、critical)。
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。所以可以采用多线程(线程池)的方式来加速读写
使用线程池的好处:
- 方便的将磁盘文件、数据库、远程api的I/O调用并发执行
- 线程池的线程数不会无限创建(导致系统挂掉),具有防御功能。
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安装
-
从git地址直接下载压缩包。
-
解压压缩包(以Ubuntu系统为例)
unzip simpleui-master.zip
- 进入目录,并安装
cd simpleui-master
pip install .
方法4:从git上下载压缩包,并直接引入
- 按照方法3解压后会得到目录
simpleui-master/simpleui/ - 将
simpleui文件夹放到你的项目目录:
your_project/
simpleui/ ← 手动放进来
manage.py
yourapp/
- 然后在
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

浙公网安备 33010602011771号