• 【Django快速开发实战】(52~76)使用Django创建一个基础应用:职位管理系统


    52 | 生产环境要注意哪些事项:生产环境的应用部署

    在这里插入图片描述

    单元测试

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    老师的testcase/test_views.py

    from django.test import TestCase
    from django.test import Client
    
    from jobs.models import Job, JobTypes, Cities
    
    class JobTests(TestCase):
    
        @classmethod
        def setUpTestData(cls):
            # Set up data for the whole TestCase
            cls.job = Job.objects.create(job_name="Java开发工程师", job_type=JobTypes[0][0], job_city=Cities[1][0], job_requirement="精通Java开发")
            
    
        def test1(self):
            # Some test using self.job
            pass
    
    
        def test_index(self):
            client = Client()
            response = client.get('/joblist/')
            self.assertEqual(response.status_code, 200)
    
    
        def test_detail(self):
            # 使用 TestCase.self.client 作为 HTTP Client:
            response = self.client.get('/job/1/')
            self.assertEqual(response.status_code, 200)
    
            job = response.context['job']
            self.assertEqual(job.job_name, JobTests.job.job_name)
    
    • 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

    我的testcase/test_views.py

    from django.test import TestCase
    from django.test import Client
    
    from GAGA_meeting.models import project
    
    class projectTests(TestCase):
    
        @classmethod
        def setUpTestData(cls):
            # Set up data for the whole TestCase
            cls.job = project.objects.create(project_name="MA", project_owner_name='season',)
            
    
        def test1(self):
            # Some test using self.job
            pass
    
    
        def test_index(self):
            client = Client()
            response = client.get('admin/')
            self.assertEqual(response.status_code, 200)
    
    
        def test_detail(self):
            # 使用 TestCase.self.client 作为 HTTP Client:
            response = self.client.get('')
            self.assertEqual(response.status_code, 200)
    
            job = response.context['job']
            self.assertEqual(job.job_name, JobTests.job.job_name)
    
    • 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

    在这里插入图片描述

    生产环境 Django 配置

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    同步服务器:uWSGI与gunicorn功能类似,都需要与Nginx配合,选择一个即可。
    异步服务器:Uvicorn(有异步views可用此服务器)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    53 | 应用水平扩展:使用负载均衡(待研究-Nginx配置)

    应用水平扩展:使用Tengine 和负载均衡

    在这里插入图片描述
    在这里插入图片描述

    最简单配置: 路由转发请求到 Gunicorn/uWSGI 服务

    在这里插入图片描述

    使用Tengine/Nginx 负载均衡

    在这里插入图片描述

    Tengine 的分流策略

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    54 | 让网站访问更快:使用CDN加速(待研究-Nginx配置)

    为什么要使用CDN

    在这里插入图片描述

    CDN访问的两阶段

    在这里插入图片描述

    加速静态资源访问的两个方法

    在这里插入图片描述

    使用CDN的两种方式

    在这里插入图片描述
    在这里插入图片描述

    55 | 让故障在第一时间被感知到:接入监控告警(待研究)

    让故障第一时间被感知到:接入监控告警

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    告警趋势可视化: Prometheus & Grafana 概念介绍

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    Prometheus & Grafana 接入

    在这里插入图片描述
    https://github.com/korfuri/django-prometheus
    在这里插入图片描述

    56 | 生产环境中的安全:生产环境的安全设计

    生产环境中的安全:生产环境的安全设计

    在这里插入图片描述

    防火墙的类型

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    57 | 生产环境中的安全:应用安全

    防恶意密码攻击

    在这里插入图片描述
    https://django-simple-captcha.readthedocs.io/en/latest/usage.html
    在这里插入图片描述
    在这里插入图片描述

    • views.py代码来实现功能:连续失败过多则需要验证码页面
    from django import forms
    from django.contrib.auth import authenticate, login
    from django.contrib.auth.forms import AuthenticationForm
    from django.contrib import messages
    
    from captcha.fields import CaptchaField # 导入模块
    from django.shortcuts import render
    
    from django.http.response import HttpResponseRedirect
    from django.urls import reverse_lazy
    
    from ratelimit.decorators import ratelimit
    
    import logging
    
    logger = logging.getLogger(__name__)
    
    class CaptchaLoginForm(AuthenticationForm):
        # username = forms.CharField(label='用户名')
        # password = forms.CharField(widget=forms.PasswordInput, label='密码')
        captcha = CaptchaField(label='验证码')
    
    max_failed_login_count = 3
    
    @ratelimit(key='ip', rate='5/m', block=True)
    def login_with_captcha(request):
        if request.POST:
            failed_login_count = request.session.get('failed_login_count', 0)
    
            # 没有连续的登陆失败, 使用默认的登陆页; 连续 n 次登陆失败, 要求输入验证码
            if failed_login_count >= max_failed_login_count :
                form = CaptchaLoginForm(data=request.POST)
            else:
                form = AuthenticationForm(data=request.POST)
    
            # Validate the form: the captcha field will automatically
            # check the input
            if form.is_valid():
                request.session['failed_login_count'] = 0
                # authenticate user with credentials
                user = authenticate(username=form.cleaned_data["username"], password=form.cleaned_data["password"])
                if user is not None:
                    # attach the authenticated user to the current session
                   login(request,user)
                   return HttpResponseRedirect(reverse_lazy('admin:index'))
            else:
                failed_login_count += 1
                request.session['failed_login_count'] = failed_login_count
                logger.warning(" ----- failed login for user: %s, failed times:%s" %  (form.data["username"], failed_login_count) )
                if failed_login_count >= max_failed_login_count :
                    form = CaptchaLoginForm(request.POST)
                messages.add_message(request, messages.INFO, 'Not a valid request')
        else:
            ## 没有连续的登陆失败, 使用默认的登陆页; 连续 n 次登陆失败, 要求输入验证码
            failed_login_count = request.session.get('failed_login_count', 0)
            if failed_login_count >= max_failed_login_count :
                form = CaptchaLoginForm(request.POST)
            else:
                form = AuthenticationForm()
    
        return render(request, 'login.html', {'form': form})
    
    • 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
    • settings.py
    INSTALLED_APPS = [
    ...
        'captcha',
    ]
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    应用访问限流

    在这里插入图片描述
    Rest Framework API限流
    在这里插入图片描述
    应用限流
    https://django-ratelimit.readthedocs.io/en/stable/index.html
    在这里插入图片描述
    在这里插入图片描述

    • views.py增加@ratelimit装饰符(以限制IP方式限流,每分钟不超过5次)
    @ratelimit(key='ip', rate='5/m', block=True)
    def login_with_captcha(request):
    
    • 1
    • 2

    58 | 生产环境中的安全:架构安全(待研究)

    在这里插入图片描述

    架构安全 -应用的部署架构

    在这里插入图片描述

    架构安全 – 密钥存储

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    59 | 生产环境中的安全:数据安全(待研究)

    感觉就是HTTPS

    SSL 证书的使用

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    敏感数据加密

    在这里插入图片描述

    日志脱敏

    在这里插入图片描述

    60 | 生产环境中的安全:密码安全与业务安全

    密码安全

    在这里插入图片描述
    在这里插入图片描述

    • django自带密码认证功能
    
    # Password validation
    # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    61 | 云环境中的部署:Docker容器的基础用法

    容器的基础用法 – Docker 容器介绍

    在这里插入图片描述
    在这里插入图片描述

    容器的基础用法

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    62 | 云环境中的部署:如何像分发集装箱一样发布应用

    用容器部署应用 Dockerfile

    在这里插入图片描述
    在这里插入图片描述

    用容器部署应用 Docker compose

    在这里插入图片描述

    63 | 云环境中的部署:开发环境的容器化&构建小镜像

    容器化 Django 应用 – 构建小镜像

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    运行容器

    在这里插入图片描述

    64 | 云环境中的部署:什么时候需要容器编排

    容器编排 – docker compose

    在这里插入图片描述
    在这里插入图片描述

    容器编排 - Docker, compose 与 k8s

    在这里插入图片描述

    容器编排 – k8s 的架构

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我的实战https://blog.csdn.net/m0_46629123/article/details/126527984

    65 | 云环境中的部署:阿里云上搭建Kubernetes集群(待研究-阿里云)

    阿里云上搭建Kubernetes集群

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    66 | 云环境中的部署:管理监控容器中的Django应用(待研究-阿里云)

    管理监控容器中的Django应用

    就是安装Prometheus和Grafana
    在这里插入图片描述
    https://help.aliyun.com/document_detail/94622.html
    在这里插入图片描述
    在这里插入图片描述

    67 | 云环境中的部署:应用日志收集与查询(待研究-阿里云)

    应用日志收集与查询

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    https://help.aliyun.com/document_detail/87540.html

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    68 | 云环境中的持续集成:CI/CD的工作流程(待研究-阿里云)

    使用Jenkins来做CICD

    CI/CD的工作流程

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    69 | 云环境中的持续集成:CI/CD的基本使用(待研究-阿里云)

    CI/CD的基本使用

    在这里插入图片描述
    在这里插入图片描述
    https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    70 | 快速迭代的价值与挑战

    快速迭代的价值与挑战

    在这里插入图片描述
    在这里插入图片描述

    71 | 使用OOPD方法识别产品核心功能

    使用OOPD方法识别产品核心功能

    在这里插入图片描述
    在这里插入图片描述

    72 | 如何做技术方案设计与工作拆解

    如何做技术方案设计与工作拆解

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    73 | 如何保证交付质量和持续迭代

    如何保证交付质量和持续迭代

    在这里插入图片描述
    在这里插入图片描述

    74 | 如何更高效地寻求帮助?

    如何更高效地寻求帮助

    在这里插入图片描述
    在这里插入图片描述

    75 | 一名Hacker的成长之路

    一名Hacker的成长之路

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    76 | 结束语

    课程回顾

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    野火FPGA入门(2):Verilog HDL基础语法
    java毕业设计医院管理系统Mybatis+系统+数据库+调试部署
    读写Raw文件
    服务器没有安装torch库的解决记录
    【爬虫实战】用pyhon爬百度故事会专栏
    【金TECH频道】从第一性原理出发,数字原生银行原来可以这样做
    torch.optim.Adam
    DDIM代码详细解读(3):核心采样代码、超分辨率重建
    avue常用场景记录
    深度学习中的偏差、方差、正则化
  • 原文地址:https://blog.csdn.net/m0_46629123/article/details/126447694