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实现多线程采集的2个代码例子
Jul 07 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
python实现向ppt文件里插入新幻灯片页面的方法
Apr 28 Python
Python 正则表达式实现计算器功能
Apr 29 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
Python对切片命名的实现方法
Oct 16 Python
pycharm 配置远程解释器的方法
Oct 28 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
python实现LRU热点缓存及原理
Oct 29 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
python使用glob检索文件的操作
May 20 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中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
python实现12306火车票查询器
2017/04/20 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
python实现最长公共子序列
2018/05/22 Python
浅谈python中get pass用法
2019/03/19 Python
如何在django中添加日志功能
2020/02/06 Python
django中的数据库迁移的实现
2020/03/16 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
美国家具网站:Cymax
2016/09/17 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
SQL语言面试题
2013/08/27 面试题
软件设计的目标是什么
2016/12/04 面试题
大学生职业规划书的范本
2014/02/18 职场文书
公司建议书怎么写
2014/05/15 职场文书
新农村建设标语
2014/06/24 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python