• pt29django教程


    文件上传

    文件上传必须为POST提交方式,

    表单

    中文件上传时必须有带有enctype="multipart/form-data" 时才会包含文件内容数据。

    表单中用标签上传文件

    • 名字xxx对应request.FILES['xxx'] 对应的内存缓冲文件流对象。可通能过request.FILES['xxx'] 返回的对象获取上传文件数据
    • file=request.FILES['xxx'] file 绑定文件流对象,可以通过文件流对象的如下信息获取文件数据,file.name 文件名,file.file 文件的字节流数据

    上传文件的表单书写方式

    
    <html>
    <head>
        <meta charset="utf-8">
        <title>文件上传title>
    head>
    <body>
        <h3>上传文件h3>
        <form method="post" action="/test_upload" enctype="multipart/form-data">
            <input type="file" name="myfile"/><br>
            <input type="submit" value="上传">
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在setting.py 中设置MEDIA相关配置;Django把用户上传的文件,统称为media资源

    # file : settings.py
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
    • 1
    • 2
    • 3

    初始化配置

    [root@vm ~]# django-admin startproject mysite9
    [root@vm ~]# cd mysite9/
    [root@vm mysite9]# vim mysite9/settings.py
    
    ALLOWED_HOSTS = ['*',]
    
    LANGUAGE_CODE = 'zh-Hans'
    
    TIME_ZONE = "Asia/Shanghai"
    
    [root@vm mysite9]# python3 manage.py runserver 0.0.0.0:8000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    media的路由、存储路径

    [root@vm mysite9]# mkdir media
    [root@vm mysite7]# vim mysite9/settings.py
    #最后添加
    # media的访问路由
    MEDIA_URL = '/media/'
    # media的存储路径
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上传页temlplates

    [root@vm mysite9]# mkdir templates
    [root@vm mysite9]# vim mysite9/settings.py
    ...
    TEMPLATES = [
    ...
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            
    [root@vm mysite9]# vim mysite9/urls.py
    from django.contrib import admin
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('test_upload',views.upload_view),
    ]
    
    [root@vm mysite9]# vim mysite9/views.py
    from django.http import HttpResponse
    from django.shortcuts import render
    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt# 处理csrf问题
    def upload_view(request):
        if request.method == 'GET':
            return render(request, 'upload.html')
        elif request.method == 'POST':
            # add your code here
            return HttpResponse("上传文件成功!")
    
    [root@vm mysite9]# vim templates/upload.html
    <html>
    <head>
        <meta charset="utf-8">
        <title>文件上传</title>
    </head>
    <body>
        <h3>上传文件</h3>
        <form method="post" action="/test_upload" enctype="multipart/form-data">
           文件说明:<input type="text" name="desc"/><br>
            <input type="file" name="myfile"/><br>
            <input type="submit" value="上传">
        </form>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    上传页访问验证

    http://192.168.1.11:8000/test_upload     #正常显示,上传返回成功
    
    • 1

    传统函数上传(不推荐)

    [root@vm mysite9]# vim mysite9/views.py
    from django.http import HttpResponse
    from django.shortcuts import render
    from django.views.decorators.csrf import csrf_exempt
    # 导入Django本身提供的settings模块,用于下面文件的写入路径
    from django.conf import settings
    import os
    
    @csrf_exempt
    def upload_view(request):
        if request.method == 'GET':
            return render(request, 'upload.html')
        elif request.method == 'POST':
            # add your code here
            # 1.desc是一个字符串
            desc = request.POST['desc']
            # 2.myfile是一个对象
            myfile = request.FILES['myfile']
            print(desc)
            print(myfile.name)
            # 一、python的方案     同名将会覆盖
            # 3.准备完整文件写入的路径
            filename = os.path.join(settings.MEDIA_ROOT,
                                    myfile.name)
            print(filename)
            # 4. 写入文件
            with open(filename, 'wb') as f:
                data = myfile.file.read()
                f.write(data)
            # 5. 返回响应
            return HttpResponse("上传文件成功!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    #访问: http://192.168.1.11:8000/test_upload  上传验证
    终端日志
    debug.log
    /root/mysite9/media/debug.log
    服务器文件
    [root@vm mysite9]# ls media/
    debug.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    orm函数上传

    [root@vm mysite9]# python3 manage.py startapp test_upload
    [root@vm mysite9]# vim mysite9/settings.py
    INSTALLED_APPS = [
    ...
        'test_upload',
    ...
    DATABASES = {
        'default' : {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mysite9',
            'USER': 'root',
            'PASSWORD': '123456',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        }
    }
    
    [root@vm mysite9]# mysql -uroot -p123456 -e 'create database mysite9 default charset utf8;'
    
    [root@vm mysite9]# vim test_upload/models.py
    from django.db import models
    # Create your models here.
    class Content(models.Model):
        # 与表单控件文件描述对应
        desc = models.CharField(max_length=100)
        # 与文件上传对应
        # upload_to在media目录下,创建一个子目录 myfiles
        myfile = models.FileField(upload_to='myfiles')
    [root@vm mysite9]# mkdir  media/myfiles
    
    [root@vm mysite9]# python3 manage.py makemigrations
    [root@vm mysite9]# python3 manage.py migrate
    [root@vm mysite9]# mysql -uroot -p123456 -e 'desc mysite9.test_upload_content;'       +--------+--------------+------+-----+---------+----------------+
    | Field  | Type         | Null | Key | Default | Extra          |
    +--------+--------------+------+-----+---------+----------------+
    | id     | int(11)      | NO   | PRI | NULL    | auto_increment |
    | desc   | varchar(100) | NO   |     | NULL    |                |
    | myfile | varchar(100) | NO   |     | NULL    |                |
    +--------+--------------+------+-----+---------+----------------+
    
    [root@vm mysite9]# vim mysite9/views.py
    from django.http import HttpResponse
    from django.shortcuts import render
    from django.views.decorators.csrf import csrf_exempt
    from test_upload.models import Content
    
    @csrf_exempt
    def upload_view(request):
        if request.method == 'GET':
            return render(request, 'upload.html')
        elif request.method == 'POST':
            # add your code here
            # 1.desc是一个字符串
            desc = request.POST['desc']
            # 2.myfile是一个对象
            myfile = request.FILES['myfile']
            print(desc)
            print(myfile.name)
            Content.objects.create(desc=desc,
                                   myfile=myfile)
            # 5. 返回响应
            return HttpResponse("上传文件成功!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    上传测试

    #http://192.168.1.11:8000/test_upload    #同名文件上传两次
    
    [root@vm mysite9]# ls  media/myfiles/
    debug.log  debug_UedOwim.log  
    [root@vm mysite9]# mysql -uroot -p123456 -e 'select * from  mysite9.test_upload_content;'
    +----+------+---------------------------+
    | id | desc | myfile                    |
    +----+------+---------------------------+
    |  1 | 123  | myfiles/debug.log         |
    |  2 | 145  | myfiles/debug_UedOwim.log |
    +----+------+---------------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    访问上传的资源

    若要在浏览器中访问 上传的资源,runserver环境下,需要在项目得主路由下添加media路由的绑定

    from django.conf import settings
    from django.conf.urls.static import static
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
    • 1
    • 2
    • 3
    [root@vm mysite9]# vim mysite9/urls.py
    from django.contrib import admin
    from django.urls import path
    from . import views
    from django.conf import settings
    from django.conf.urls.static import static
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('test_upload',views.upload_view),
    ]
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
    
    访问: http://192.168.1.11:8000/media/myfiles/debug_UedOwim.log   #下载
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    电子邮件发送

    利用QQ邮箱发送电子邮件

    django.core.mail 子包封装了 电子邮件的自动发送SMTP协议

    前其准备:

    用QQ号登陆QQ邮箱并修改设置
       - 用申请到的QQ号和密码登陆到 
       - 修改 `QQ邮箱->设置->帐户->“POP3/IMAP服务开启”`
    设置Django服务器端的,用简单邮件传输协议SMTP(Simple Mail Transfer Protocol) 发送电子邮件
    
    • 1
    • 2
    • 3
    • 4

    settings.py 设置

    [root@vm mysite9]# vim mysite9/settings.py
    #放最后    发送邮件设置
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #固定写法
    EMAIL_HOST = 'smtp.qq.com' # 腾讯QQ邮箱 SMTP 服务器地址
    EMAIL_PORT = 25  # SMTP服务的端口号
    EMAIL_HOST_USER = 'xxxx@qq.com'  # 发送邮件的QQ邮箱
    EMAIL_HOST_PASSWORD = '******'  # 在QQ邮箱->设置->帐户->“POP3/IMAP......服务” 里得到的在第三方登录QQ邮箱授权码
    EMAIL_USE_TLS = True  #与SMTP服务器通信时,是否启动TLS链接(加密)默认false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    视图函数中

    from django.core import mail
    mail.send_mail(
                subject,  #题目
                message,  # 消息内容
                from_email,  # 发送者[当前配置邮箱]
                recipient_list=['xxx@qq.com'],  # 接收者邮件列表
                )
    
    >>> from django.core import mail
    >>> mail.send_mail('hello','hello world','123456@qq.com','['1234@qq.com','5678@qq.com']'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Django中的用户认证(了解)

    Django带有一个用户认证系统。 它处理用户账号、组、权限以及基于cookie的用户会话。

    作用: 添加普通用户和超级用户、修改密码

    文档参见 https://docs.djangoproject.com/en/2.2/topics/auth/

    User模型类

    位置: from django.contrib.auth.models import User,默认user的基本属性有:

    属性名类型是否必选
    username用户名
    password密码
    email邮箱可选
    first_name
    last_name
    is_superuser是否是管理员帐号(/admin)
    is_staff是否可以访问admin管理界面
    is_active是否是活跃用户,默认True。一般不删除用户,而是将用户的is_active设为False。
    last_login上一次的登录时间
    date_joined用户创建的时间

    auth基本模型操作:

    创建普通用户create_user

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='用户名', password='密码', email='邮箱',...)
    
    >>> user = User.objects.create_user(username='admin', password='123456', email='123456@qq.com,')
    
    > select * from auth_user\G
    *************************** 1. row ***************************
              id: 1
        password: pbkdf2_sha256$150...
      last_login: NULL
    is_superuser: 0
        username: admin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    创建超级用户create_superuser

    from django.contrib.auth.models import User
    user = User.objects.create_superuser(username='用户名', password='密码', email='邮箱',...)
    
    • 1
    • 2

    删除用户

    from django.contrib.auth.models import User
    try:
        user = User.objects.get(username='用户名')
        user.is_active = False  # 记当前用户无效
        user.save()
        print("删除普通用户成功!")
    except:
        print("删除普通用户失败")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    修改密码set_password

    from django.contrib.auth.models import User
    try:
        user = User.objects.get(username='xiaonao')
        user.set_password('654321')
        user.save()
        return HttpResponse("修改密码成功!")
    except:
        return HttpResponse("修改密码失败!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    检查密码是否正确check_password

    from django.contrib.auth.models import User
    try:
        user = User.objects.get(username='xiaonao')
        if user.check_password('654321'):  # 成功返回True,失败返回False
            return HttpResponse("密码正确")
        else:
            return HttpResponse("密码错误")
    except: 
        return HttpResponse("没有此用户!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    auth扩展字段

    如果需要在默认auth表上扩展新的字段,如phone
    1,添加新的应用
    2,定义模型类 继承 AbstractUser
    3,settings.py中 指明 AUTH_USER_MODEL = '应用名.类名'
    
    #models.py案例
    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    # Create your models here.
    class UserInfo(AbstractUser):
    
        phone = models.CharField(max_length=11, default='')
        
    #settings.py添加配置
    AUTH_USER_MODEL = 'user.UserInfo'
    
    #添加用户
    from user.models import UserInfo
    UserInfo.objects.create_user(username='admin', password='123456', phone='13488888888')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    项目部署

    项目部署是指在软件开发完毕后,将开发机器上运行的开发板软件实际安装到服务器上进行长期运行,部署要分以下几个步骤进行

    1. 在安装机器上安装和配置同版本的环境

    2. django 项目迁移 ,当前项目源代码到远端主机地址和文件夹

    3. 用 uwsgi 替代python3 manage.py runserver 方法启动服务器

    4. 配置 nginx 反向代理服务器

    5. 用nginx 配置静态文件路径,解决静态路径问题

    uWSGI网关接口

    配置 (ubuntu 18.04 配置)

    • WSGI (Web Server Gateway Interface)Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,被广泛使用
    • 使用 python manage.py runserver 通常只在开发和测试环境中使用(并发量有限)。
    • 当开发结束后,完善的项目代码需要在一个高效稳定的环境中运行,这时可以使用uWSGI
    • uWSGI是WSGI的一种, 它实现了 http协议 WSGI协议 以及 uwsgi(二进制协议连nginx))协议
    安装uWSGI

    终端输入如下命令

    pip3 install uwsgi==2.0.18 -i https://pypi.tuna.tsinghua.edu.cn/simple/
    
    • 1

    检查是否安装成功

    pip3 freeze | grep -i 'uwsgi'   
    
    • 1
    配置uWSGI

    添加配置文件 项目同名文件夹/uwsgi.ini,如: mysite1/mysite1/uwsgi.ini

    [root@vm mysite9]# grep -v "#" mysite9/uwsgi.ini   #项目名文件夹/uwsgi.ini`
    [uwsgi]
    http=127.0.0.1:8000
    chdir=/root/mysite9
    wsgi-file=mysite9/wsgi.py
    process=4
    threads=2
    pidfile=uwsgi.pid
    daemonize=uwsgi.log
    master=true
    [root@vm mysite9]# ls mysite9/uwsgi.ini
    mysite9/uwsgi.ini
    [root@vm mysite9]# vim mysite9/settings.py   #修改settings.py
    
    DEBUG = False
    
    ALLOWED_HOSTS = ['127.0.0.1','192.168.1.11',]  # ['网站域名'] 或者 ['服务监听的ip地址']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    [uwsgi]
    # 套接字方式的 IP地址:端口号
    # socket=127.0.0.1:8000
    # Http通信方式的 IP地址:端口号
    http=127.0.0.1:8000
    # 项目当前工作目录
    chdir=/.../my_project 这里需要换为项目文件夹的绝对路径
    # 项目中wsgi.py文件的目录,相对于当前工作目录
    wsgi-file=my_project/wsgi.py
    # 进程个数
    process=4
    # 每个进程的线程个数
    threads=2
    # 服务的pid记录文件
    pidfile=uwsgi.pid
    # 服务的目志文件位置
    daemonize=uwsgi.log
    # 开启主进程管理模式
    master=true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    启动 uwsgi
    # 进入到项目同名文件夹下 【即settings.py所在目录】
    [root@vm mysite9]# cd mysite9/
    [root@vm mysite9]# uwsgi --ini uwsgi.ini
    [root@vm mysite9]# ps aux|grep 'uwsgi'
    root       8894 13.2  1.6 337956 30508 ?        S    10:35   0:00 uwsgi --ini uwsgi.ini
    root       8897  0.0  1.3 337956 25828 ?        Sl   10:35   0:00 uwsgi --ini uwsgi.ini
    root       8898  0.0  1.3 337956 24996 ?        S    10:35   0:00 uwsgi --ini uwsgi.ini
    
    [root@vm mysite9]# more uwsgi.log  #日志查看
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    停止 uwsgi
    uwsgi --stop uwsgi.pid   #settings.py所在目录
    
    #ps -ef | grep 'uwsgi' | grep -v grep | awk '{print $2}' | xargs sudo kill -9
    
    • 1
    • 2
    • 3

    测试: 在浏览器端输入http://127.0.0.1:8000 进行测试

    nginx 及反向代理配置

    Nginx是轻量级的高性能Web服务器,提供了诸如HTTP代理和反向代理、负载均衡、缓存等一系列重要特性,C语言编写,执行效率高,在实践之中使用广泛。

    原理: 客户端请求nginx,再由nginx 将请求转发 uWSGI 运行的django

    安装

    vim /etc/apt/sources.list  #ubuntu 下 nginx 安装更改国内源
    apt-get update  && apt-get install nginx
    
    • 1
    • 2

    nginx 配置

    修改nginx 的配置文件 /etc/nginx/sites-enabled/default

    # 在server节点下添加新的location项,指向uwsgi的ip与端口。
    server {
        ...
        location / {
            uwsgi_pass 127.0.0.1:8000;  # 重定向到127.0.0.1的8000端口
            include /etc/nginx/uwsgi_params; # 将所有的参数转到uwsgi下
        }
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    nginx启动

    [root@vm mysite9]# nginx -t
    [root@vm mysite9]# nginx
    [root@vm mysite9]# ps -ef | grep nginx
    
    • 1
    • 2
    • 3
    修改uWSGI配置
    [root@vm mysite9]# vim mysite9/uwsgi.ini  #Http通信方式改为socket通信方式
    [uwsgi]
    # 去掉如下 http=127.0.0.1:8000 改为socket,此时浏览器不能直接访问
    socket=127.0.0.1:8000
    
    • 1
    • 2
    • 3
    • 4
    重启uWSGI服务
    [root@vm mysite9]# cd mysite9/
    [root@vm mysite9]# uwsgi --stop uwsgi.pid
    [root@vm mysite9]# uwsgi --ini uwsgi.ini
    [root@vm mysite9]# ps -ef | grep uwsgi   #比http少了一个管理进程
    root       9131      1  2 11:07 ?        00:00:00 uwsgi --ini uwsgi.ini
    root       9134   9131  0 11:07 ?        00:00:00 uwsgi --ini uwsgi.ini
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    测试:

    访问 http://192.168.1.11/admin/ 此时静态资源无法返回,需要进一步处理

    nginx 配置静态文件路径
    #创建新路径-主要存放Django所有静态文件
    [root@vm mysite9]# mkdir /opt/mysite9_static #创建目录存放Django所有静态文件
    
    #settings.py中添加新配置
    [root@vm mysite9]# vim mysite9/settings.py
    #... 最后添加
    STATIC_ROOT = '/opt/mysite9_static/static'
    
    #复制静态文件到STATIC_ROOT定义的目录
    [root@vm mysite9]# python3 manage.py collectstatic
    [root@vm mysite9]# ls /opt/mysite9_static/
    static
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    修改Nginx资源配置

    server {
        ...
        location /static {
             root /opt/mysite9_static;          
        }
        ...      
    }
    
    [root@vm ~]# nginx -t
    [root@vm ~]# nginx -s reload
    # 访问 http://192.168.1.11/admin/  验证
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    404/500 界面

    404.html 仅在发布版中(即setting.py 中的 DEBUG=False时) 才起作用。当向应处理函数触发Http404异常时就会跳转到404界面。

    在模板文件夹内添加 404.html 模版,当视图触发Http404 异常时将会被显示

    [root@vm mysite9]# vim templates/404.html   #404时直接返回
    
    #自定义
    from django.http import Http404
    def xxx_view( ):
        raise Http404  # 直接返回404
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    邮件告警

    当正式服务器上代码运行有报错时,可将错误追溯信息发至指定的邮箱

    配置如下 settings.py中

    #在基础邮件配置之后 添加如下
    
    #关闭调试模式
    DEBUG = False  
    
    #错误报告接收方
    ADMINS = [('admin1', 'xxxx@example.com'), ('admin2', 'xxxx@example.com')]
    
    #发送错误报告方,默认为 root@localhost账户,多数邮件服务器会拒绝
    SERVER_EMAIL = 'email配置中的邮箱'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    过滤敏感信息

    报错邮件中会显示一些错误的追踪,这些错误追踪中会出现如 password等敏感信息,Django已经将配置文件中的敏感信息 过滤修改为 多个星号,但是用户自定义的视图函数需要用户手动过滤敏感信息

    1,视图函数中的局部变量

    from django.views.decorators.debug import sensitive_variables
    
    @sensitive_variables('user', 'pw', 'cc')
    def process_info(user):
        pw = user.pass_word
        cc = user.credit_card_number
        name = user.name
        ...
    #注意:
    #1 若报错邮件中牵扯到user,pw,cc等局部变量的值,则会将其替换成  *****, 而 name 变量还显示其真实值
    #2 多个装饰器时,需要将其放在最顶部
    #3 若不传参数,则过滤所有局部变量的值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2,POST提交中的数据

    from django.views.decorators.debug import sensitive_post_parameters
    
    @sensitive_post_parameters('password', 'username')
    def index(request):
        s = request.POST['username'] + request.POST['abcd']
    	#'abcd' 并不存在,此时引发error
    #POST中 username 及 password的值会被替换成  ******
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    Perl在linux如何链接Sql Server数据库
    ShowDoc后台文件上传漏洞分析 CNVD-2020-49480(CVE-2021-41745)
    Java IO: 使用 `BufferedInputStream` 和 `BufferedOutputStream` 进行高效文件操作
    Notify
    【C语言】快速排序__拓展
    【POJ No. 2431】 丛林探险 Expedition
    【Oracle数据库系列笔记】单行函数
    CVE-2021-44228 Apache Log4j2远程代码执行漏洞复现
    SpringMVC之WEB-INF下页面跳转&@ModelAttribute&IDEA tomcat控制台中文乱码问题处理
    数据结构---课后习题(第一章)
  • 原文地址:https://blog.csdn.net/weixin_60092693/article/details/131620946