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之私有函数和专有方法
Oct 24 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
python中有关时间日期格式转换问题
Dec 25 Python
linux 下selenium chrome使用详解
Apr 02 Python
python相对企业语言优势在哪
Jun 12 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
python编写扎金花小程序的实例代码
Feb 23 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在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
2020/02/06 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
python getpass实现密文实例详解
2019/09/24 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
经理管理专业毕业自荐书范文
2014/02/12 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
考试没考好检讨书
2015/05/06 职场文书
大学推普周活动总结
2015/05/07 职场文书
名人传读书笔记
2015/06/26 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL