Django框架静态文件处理、中间件、上传文件操作实例详解
作者:张行之 发布时间:2021-03-07 14:31:04
本文实例讲述了Django框架静态文件处理、中间件、上传文件操作。分享给大家供大家参考,具体如下:
Django静态文件处理、中间件、上传文件
静态文件处理
在Django中,一般专门创建一个static目录来存放静态文件(css,js,image,video等文件)。
a. 在创建目录前,我们需要配置静态文件的路径。如:
#在项目的settings.py文件中,配置STATIC_URL,一般默认是:
STATIC_URL = '/static/' # '/static/'是指uri,映射下面的static目录。做映射可以对静态文件起到一个保护作用,避免受到攻击,下面介绍。
STATICFILES_DIRS = [
# 指定文件目录,BASE_DIR指的是项目目录,static是指存放静态文件的目录。
os.path.join(BASE_DIR , 'static'),
]
b. 创建static目录,如图:
c. 例子
{% load static from staticfiles %} <!--从staticfiles中导入静态文件-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--使用硬编码的方式请求图片,如果配置中的STATIC_URL的uri改变,这种硬编码的形式就加载不到资源-->
<img src="/static/myapp/1.png" alt="image"/>
<br/>
<!--使用映射的方式加载图片,可以避免uri短链接改变导致图片资源加载不到的问题,要用这种方式,需要导入第一行-->
<img src="{% static 'myapp/1.png' %}" alt="image"/>
</body>
</html>
中间件
中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。
a. 在Django中,中间件配置
在项目的settings.py文件中,有一个MIDDLEWARE_CLASSES
的变量,里面定义的就是中间件。如:
MIDDLEWARE_CLASSES = [
'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',
]
在settings.py文件中,默认是MIDDLEWARE
,我们要是用中间件,需要改成MIDDLEWARE_CLASSES
。
b. 每个中间件都是一个独立的Python类,可以定义下面的方法一个或多个:
__init__:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否用当前中间件。
process_request(request):执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象。
process_view(request,view_func,view_args,view_kwargs):调用视图之前调用,在每个请求上调用,返回None或HttpResponse对象。
process_template_response(request,response):在视图刚好执行完毕之后调用,在每个请求上调用,返回实现了render方法的响应对象。
process_response(request,response):所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。
process_exception(request,response,exception):当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象。
如图:
使用中间件,可以干扰整个处理过程,每次请求中都会执行中间件的方法。中间件是实际上是AOP(面向切片编程)的概念。
c. 示例
# 定义一个MyTrace类,作为中间件
class MyTrace(object):
def process_request(self, request):
print('process request')
def process_view(self, request, views, views_args, views_kwargs):
print('process view')
def process_template_response(self, request, response):
print('process template response')
return render(request=request, template_name='base.html')
def process_response(self, request, response):
print('process response')
return HttpResponse('process response')
def process_exception(self, request, exception):
print('process exception')
return HttpResponse('exception')
配置中间件,将作为中间件的类天骄到配置
MIDDLEWARE_CLASSES = [
'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',
'testdjango.middleware.MyTrace', # 自定义中间件
]
配置url和定义视图view
# 配置url,在urls.py文件中
urlpatterns = [
url(r'^base$', view.base),
url(r'exception$', view.myexception),
]
# 定义视图,在view.py文件中定义
def base(request):
print('base')
return HttpResponse('response')
def myexception(request):
print('myexception')
int('abc')
return HttpResponse('exception')
在浏览器输入,127.0.0.1:8000/base
,输出
process request
process view
base
process response
在浏览器输入,127.0.0.1:8000/exception
,输出
process request
process view
myexception
process exception
process response
上传图片
a. 配置上传图片的路径
在settings.py文件中,配置MEDIA_ROOT,如:
MEDIA_ROOT = BASE_URL + '/static/media' # 一般配置成静态文件目录下
在项目中,创建/static/media/
目录
b. 配置url
在项目的urls.py文件,配置url,如:
urlpatterns = [
url(r'upload/form/',view.form), # 上传图片的form表单
url(r'upload/image/',view.image), # 上传图片的url
]
c. 编写模板
表单模板,upload_form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/upload/image/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="image">
<br>
<input type="submit" value="上传">
</form>
</body>
</html>
d. 处理视图逻辑
在view.py文件定义2个方法,分别为form()和image(),如:
def form(request):
return render(request=request, template_name='update_form.html')
def image(request):
if request.method == 'POST':
image = request.FILES['image']
imageName = os.path.join(settings.MEDIA_ROOT, image.name)
print(imageName)
with open(imageName, 'wb') as f:
for image_part in image.chunks():
f.write(image_part)
return HttpResponse('上传成功')
else:
return HttpResponse('method 方法 错误')
e. 浏览器操作
在浏览器中输入,127.0.0.1:8000/upload/form
出现如下表单:
选择图片,点击上传,出现上传成功,表示图片已上传到文件中。
希望本文所述对大家基于Django框架的Python程序设计有所帮助。
来源:https://blog.csdn.net/qq_33689414/article/details/78446620
猜你喜欢
- var long2="1988-0w-07";alert(long2.substring(0,4)+"----
- 本文实例讲述了python中迭代器(iterator)用法。分享给大家供大家参考。具体如下:#-----------------------
- 我发现有的网站利用了SQL SERVER提供的通过EXCHANGE或OUTLOOK收发邮件的扩展存储过程来完成收发和自动处理邮件(这句话太长
- 本文实例讲述了Python Web框架之Django框架cookie和session用法。分享给大家供大家参考,具体如下:part 1 概念
- 适配器模式说明说明: 适配器模式,一般是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况;场景: 就好比我们买了台
- 在Go语言中,我们可以使用for、append()和copy()进行数组拷贝,对于某些对性能比较敏感且数组拷贝比较多的场景,我们可以会对拷贝
- 这一段时间,我在进行“09帮助中心升级”项目,负责其中的白板和视觉设计,总算和Axure有了第一次的正式会晤。由于之前已经零散地学习过一些A
- 当系统出现故障时,只要存在数据日志那么就可以利用它来恢复数据解决数据库故障。作为SQL Server数据库管理员,了解数据日志文件的作用,以
- 代码如下:--获取当前时间 Select getdate() --获取当前年月日 YY代表年,MM代表月,DD代表日,hh代表时
- 本文实例为大家分享了Python tkinter实现计算器功能的具体代码,供大家参考,具体内容如下python版本:3.5一.计算器的功能描
- 要求:用户名:必须是6-10位字母、数字、下划线(这里字母、数字、下划线是指任意组合,没有必须三类均包含)不能以数字开头密码:必须是6-20
- 我们先看一下JavaScript中关系运算符的类型转换规则:关系运算符(<、>、<=、>=) 试图将 express
- 1、汉语分词的由来使用ASP开发的中小企业的网站,对于站内搜索,往往只是简单的通过SQL语句匹配数据库。对于比较短的词语搜索,这个方法是有效
- 偶然看到 Tanel Poder 提到的一个 Metalink Note (438452.1): Performance Tools Qui
- 无论哪种编程语言,时间肯定都是非常重要的部分,今天来看一下python如何来处理时间和python定时任务,注意咯:本篇所讲是python3
- 一、备份数据库1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server2、SQL Server组-->
- 如果PyPi上搜html2text的话,找到的是另外一个库:Alir3z4/html2text。这个库是从aaronsw/html2text
- 本文实例讲述了Python实现可获取网易页面所有文本信息的网易网络爬虫功能。分享给大家供大家参考,具体如下:#coding=utf-8#--
- 今年我们的祖国多灾多难 雪灾的阴影还没散去又发生了地震。让我们用手中的画笔为5.12地震受灾同胞们祈福并号召大家为灾区人民捐款!中国插画网祈
- Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日