1. 静态文件处理
1.1 静态文件路径设置
将应用程序的静态文件存放在应用程序的 static 目录下,同时在应用程序的 settings.py 文件中设置 STATICFILES_DIRS 变量让 Django 能够使用这些文件。
STATIC_URL = '/static/'
STATICFILES_DIRS = [ BASE_DIR / "static", ]
1.2 静态文件访问方式
使用静态文件时,我们需要使用 {{STATIC_URL}} 这个变量作为静态文件的根路径,而不是直接使用 /static/,这样可以保证路径更加灵活、可配置。
{% load static %}
1.3 静态文件收集
在部署时,我们将应用程序和 Django 的静态文件一起收集到一个文件夹(通常是名为 static 的文件夹)中以供 Web 服务器提供。可以使用 collectstatic 管理命令来实现。
python manage.py collectstatic
2. 中间件
2.1 中间件作用
中间件是 Django 强大而灵活的功能之一,它允许在请求和响应的过程中进行干预,以进行各种处理。如:身份验证、缓存、数据转换和其他种类的处理。
2.2 中间件实现方式
首先,我们需要定义中间件类,然后在 settings.py 中添加其完整名称。中间件的处理顺序是通过它们在 settings.py 文件中的顺序来确定的。第一个中间件被看作是最先运行的中间件,最后一个中间件被看作是最后运行的中间件。
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 在请求处理之前进行的操作
response = self.get_response(request)
# 在响应返回之前进行的操作
return response
2.3 中间件应用
将中间件添加到 settings.py 文件中以应用中间件。
MIDDLEWARE = [
...,
'myapp.middleware.MyMiddleware',
...,
]
3. 上传文件操作
3.1 文件上传设置
要使 Django 能够处理上传的文件,我们需要让 Django 了解上传目录的位置。我们需要在 settings.py 文件中添加两个配置,分别是 MEDIA_URL 和 MEDIA_ROOT。
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
3.2 文件上传到服务器
在模板中添加 enctype 属性让表单进行文件上传,如下所示:
在视图中,当表单提交时,我们可以通过对 request.FILES 的处理来访问上传的文件。 request.FILES 是一个类似于字典的对象,它存储上传的文件。
def my_view(request):
if request.method == 'POST':
uploaded_file = request.FILES['file']
# 处理上传文件
return render(request, 'myapp/upload.html')
3.3 文件保存到磁盘
要将上传的文件保存到磁盘,我们可以使用 Python 标准库中的模块 os。
def my_view(request):
if request.method == 'POST':
uploaded_file = request.FILES['file']
fs = FileSystemStorage()
filename = fs.save(uploaded_file.name, uploaded_file)
uploaded_file_url = fs.url(filename)
# 处理上传文件
return render(request, 'myapp/upload.html', {'uploaded_file_url': uploaded_file_url})
以上代码将上传的文件保存到 media 文件夹中并返回文件的 URL,以便在模板中显示。
3.4 文件限制
Django 可以限制上传文件的大小、类型和数量。
MYAPP_UPLOAD_SIZE_LIMIT = 2 * 1024 * 1024 # 2 MB
class UploadForm(forms.Form):
file = forms.FileField()
def clean_file(self):
file = self.cleaned_data.get('file')
if file.size > MYAPP_UPLOAD_SIZE_LIMIT:
raise ValidationError("File too large")
if not file.content_type.startswith('image/'):
raise ValidationError("Invalid file type")
return file
使用 clean_file() 方法来验证并限制上传文件的大小和类型。
本文介绍了 Django 中的静态文件处理、中间件、上传文件操作的基本使用,帮助开发人员更好地应用 Django 框架进行开发。