Twelve-Factors方法论和Django基础

《Django高级实战-开发企业及问答网站》学习笔记1:12-factor方法论、用户模型、视图和单元测试。
215阅读 · 2评论 · 2020-7-15 23:58发布

12-factors实践

软件开发过程中,应该尽量应用Twelve-Factor方法论。该十二条是业界大部分公司认同的实践。

  • 官网:https://12factor.net
    I. 基准代码
    一份基准代码,多份部署
    II. 依赖
    显式声明依赖关系
    III. 配置
    在环境中存储配置
    IV. 后端服务
    把后端服务当作附加资源
    V. 构建,发布,运行
    严格分离构建和运行
    VI. 进程
    以一个或多个无状态进程运行应用
    VII. 端口绑定
    通过端口绑定提供服务
    VIII. 并发
    通过进程模型进行扩展
    IX. 易处理
    快速启动和优雅终止可最大化健壮性
    X. 开发环境与线上环境等价
    尽可能的保持开发,预发布,线上环境相同
    XI. 日志
    把日志当作事件流
    XII. 管理进程
    后台管理任务当作一次性进程运行
    

用户模型

django自带用户系统,也可以使用自定义用户模型。

使用自定义用户模型很简单,自定义用户模型继承BaseUserManager或AbstractBaseUser,在settings.py中配置AUTH_USER_MODEL指定用户模型类。

  • AbstractUser:继承自AbstractBaseUser,增加了用户相关的字段。例如first_name、last_name、email等字段。
  • BaseUserManager:控制用户的创建过程。例如重写create_user方法和create_superuser方法,就可以在创建普通用户和超级用户(python manage.py createsuperuser admin)时,按照自定义方法的要求创建。

    class MyUserManager(BaseUserManager):
    
          def create_user(self, username, password=None):
              pass
              return user
    
          def create_superuser(self, username, password):
              pass
              return user
    
      class User(AbstractUser):
          ...省略...
          objects = MyUserManager()
    

视图

Django中有三种视图:函数视图(FBV)、类视图(CBV)、通用视图(CBGV)。

  • 函数视图:通过条件分支方式响应不同的HTTP请求。
    from django.http import HttpResponse
      def my_view(request):
          if request.method == 'GET':
              return HttpResponse('request')
          elif request.method == 'POST':
              return HttpResponse('request')
          elif request.method == 'DELETE':
              return HttpResponse('request')
    
  • 类视图:通过不同实例方法响应不同HTTP请求。

    from django.views.generic import View
      class MyView(View):
          def get(self, request, *args, **kwargs):
              pass
    
          def post(self, request, *args, **kwargs):
              pass
    
      # urls.py配置
      from demo.users.views import MyView
      urlpatterns = [
          path("myview/", view=MyView.as_view(a=1), name="my" )
      ]
    
  • 通用类视图:将重复的方法和模式抽象出来。(通用类视图学习网站:ccbv.co.uk)

    # 通用类视图
      class BaseDetailView(View):
          def get(self, request, *args, **kwargs):
              context = {"value":"test"}
              return self.render_to_response(context)
    
      class UserDetailView(DetailView):
          def get_context_data(self, *args, **kwargs):
              pass
    

单元测试

  • 测试用例是保证代码质量的基本。
  • python manage.py test即可执行本项目所有测试用例。
  • 视图、路由、模型和表单都要测试。
  • 每一个类的方法都要编写测试用例,对应的功能要最小化。
  • 测试类中每个函数只测试一个功能点,函数需要以test_开头。
  • 提交代码前,需要跑通所有测试用例。
  • 第三方库coverage,可以输出测试覆盖度。

    pip install coverage -i https://pypi.douban.com/simple
      # -v表示运行过程中输出具体信息
      coverage run manage.py test -v 2
      # 生成html报告
      coverage html
      # 执行后会生成htmlcov文件夹,打开index.html即可查看报告。
      # 报告中会显示代码已覆盖部分和未覆盖部分。
      # 直接命令行中查看报告
      coverage report
    


共有2 条评论


  • Jacky 2020-7-16 09:57 时说:
    给博主点赞!

  • Tk 2020-7-17 23:26 时说:
    专业!