Django框架静态文件处理、中间件、上传文件操作实例详解


Posted in Python onFebruary 29, 2020

本文实例讲述了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目录,如图:

Django框架静态文件处理、中间件、上传文件操作实例详解

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对象。

如图:

Django框架静态文件处理、中间件、上传文件操作实例详解

使用中间件,可以干扰整个处理过程,每次请求中都会执行中间件的方法。中间件是实际上是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/目录

Django框架静态文件处理、中间件、上传文件操作实例详解

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框架静态文件处理、中间件、上传文件操作实例详解

选择图片,点击上传,出现上传成功,表示图片已上传到文件中。

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
Python定时执行之Timer用法示例
May 27 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
python实现自动发送报警监控邮件
Jun 21 Python
python3中的eval和exec的区别与联系
Oct 10 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
python PIL模块的基本使用
Sep 29 Python
OpenCV实现常见的四种图像几何变换
Apr 01 Python
python神经网络Xception模型
May 06 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 #Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 #Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 #Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 #Python
Python使用GitPython操作Git版本库的方法
Feb 29 #Python
如何使用python代码操作git代码
Feb 29 #Python
使用 Python 遍历目录树的方法
Feb 29 #Python
You might like
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
php文件系统处理方法小结
2016/05/23 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
Ionic快速安装教程
2016/06/03 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
Python3爬虫学习入门教程
2018/12/11 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
承兑汇票转让证明怎么写?
2014/11/30 职场文书
小学班主任教育随笔
2015/08/15 职场文书