项目需求分析和Cookiecutter搭建项目

《Django高级实战-开发企业及问答网站》学习笔记2:项目需求分析、开发技术栈、Cookiecutter搭建项目和Pycharm远程开发设置。​
502阅读 · 2020-7-17 22:40发布

项目需求分析和功能设计

项目需求分析

列出项目的所有需求点,以我的datatest.org博客为例。

项目需求分析图,以个人博客项目示例:

需求规格说明书,思维导图:

模块化功能设计

  • 需要按照低耦合、高内聚来设计功能。
  • 低耦合:不同模块之间降低互相之间的依赖性。既A模块出问题时不会影响B模块。
  • 高内聚:一个功能模块中的功能点相关程度高。

开发技术栈

提前确定对应功能模块使用的技术栈。(课程中的内容)

  • HTML/CSS:用于前端的布局和样式(基础)。
  • JQuery:用于界面元素操作。
  • Bootstrap:用于样式美观。
  • DTL:Django Template Language,模板语法,前后端不分离。
  • Websocket:用于消息通知,后端通知给前端。
  • Python3.7+Django2.2:后端代码基础。
  • Cookiecutter:用于创建项目模板。
  • Haystack + Elasticsearch:用于全站搜索。
  • channels:用于后端的websocket编程。
  • Celery:用于实现异步任务。
  • django-compressor:压缩网页静态文件。

常用Django开发包:

  • django-taggit:标签功能。
  • djang-environ:使用环境变量保存敏感信息。
  • django-markdownx:使django支持markdown语法。
  • django-crispy-forms:使from表单更美观。
  • awesome-slugify:网址的uuid。
  • sorl-thumbnail:图片处理。
  • django-contrib-comments:评论。
  • django-allauth:用户登录。

Cookiecutter搭建项目

Cookiecutter安装和使用

Cookiecutter是快速建立工程模板的命令行工具。支持python、php、java等各种语言的工程创建。使用该工具生成的文件结构比较规范。

  1. 安装
    pip install cookiecutter -i https://pypi.douban.com/simple
    
  2. 创建工程模板
    # 系统中需要已安装git
     cookiecutter https://github.com/pydanny/cookiecutter-django.git
     # 或cookiecutter git@github.com:pydanny/cookiecutter-django.git
    
  3. 根据提示向下执行,部分内容会设置到settings.py文件中。可以参考如下配置:
    E:\tmp\codes>cookiecutter https://github.com/pydanny/cookiecutter-django
     project_name [My Awesome Project]: djangodemo  # 项目名称
     project_slug [djangodemo]: app01  # slug
     description [Behold My Awesome Project!]: test django!  # 项目描述
     author_name [Daniel Roy Greenfeld]: datatest  #坐着
     domain_name [example.com]: datatest.org  #部署的域名
     email [datatest@example.com]: datatest@datatest.org  #邮箱
     version [0.1.0]:  #版本号
     Select open_source_license:  # 开源证
     1 - MIT
     2 - BSD
     3 - GPLv3
     4 - Apache Software License 2.0
     5 - Not open source
     Choose from 1, 2, 3, 4, 5 [1]: 5
     timezone [UTC]: Asia/Shanghai  # settings的TIME_ZONE
     windows [n]: y  #是否windows环境
     use_pycharm [n]: y  # 是否使用pycharm开发
     use_docker [n]:  # 是否使用docker
     Select postgresql_version:  # 数据库版本
     1 - 12.3
     2 - 11.8
     3 - 10.8
     4 - 9.6
     5 - 9.5
     Choose from 1, 2, 3, 4, 5 [1]: 5
     Select js_task_runner:
     1 - None
     2 - Gulp
     Choose from 1, 2 [1]:
     Select cloud_provider:
     1 - AWS
     2 - GCP
     3 - None
     Choose from 1, 2, 3 [1]:
     Select mail_service:
     1 - Mailgun
     2 - Amazon SES
     3 - Mailjet
     4 - Mandrill
     5 - Postmark
     6 - Sendgrid
     7 - SendinBlue
     8 - SparkPost
     9 - Other SMTP
     Choose from 1, 2, 3, 4, 5, 6, 7, 8, 9 [1]:
     use_async [n]:
     use_drf [n]:
     custom_bootstrap_compilation [n]:
     use_compressor [n]:
     use_celery [n]:
     use_mailhog [n]:
     use_sentry [n]:
     use_whitenoise [n]:
     use_heroku [n]:
     Select ci_tool:
     1 - None
     2 - Travis
     3 - Gitlab
     Choose from 1, 2, 3 [1]:
     keep_local_envs_in_vcs [y]:
     debug [n]: y
      [INFO]: .env(s) are only utilized when Docker Compose and/or Heroku support is enabled so keeping them does not make sense given your current setup.
      [SUCCESS]: Project initialized, keep up the good work!
    
  4. 进入创建时输入的名称,查看目录结构,完成。

Pycharm远程开发设置

  1. 配置远程服务器:Tools-Deployment-Configuration配置服务器信息(SFTP方式)。
  2. 连接服务器中的解释器:File-Settings-Project:xxxx-Project Interpreter,新建环境变量,选择SSH Interpreter,配置相关远程连接信息。
  3. 配置完成后,右键选择项目文件夹,选择Deployment-Upload或Download。
  4. 配置django server。
  5. 完成

编写单元测试用例

  • 使用djagno-test-plus第三方库,它是基于TestCase基础上增强了一些特性。
  • 在django应用下有test.py文件,该文件专门用于编写测试用例。(也可以新建tests文件,根据测试的模块不同建对应的test_models.py文件)
  • 单元测试用例需要对应用的每个函数进行断言。
  • test.py文件中,测试用例需要以test_开头。
  • asserEqual():判断2个参数值是否相同,相同则返回True。
  • model测试用例示例:

    # model文件
      from django.db import models
    
      from mptt.models import MPTTModel,TreeForeignKey
    
      class Comments(MPTTModel):
          name = models.CharField(max_length=50,verbose_name="留言名称")
          content = models.TextField(verbose_name="留言")
          parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
    
          def __str__(self):
              return self.name
    
    # model的测试用例
      from .models import Comments
      from test_plus.test import TestCase
    
      # model测试用例
      class TestComment(TestCase):
    
          def setUp(self):
              self.c = Comments.objects.create(name='test')
    
          def test_str__(self):
              self.assertEqual(self.c.__str__(), 'test')
    
  • urls测试用例示例:

    # urls.py文件
      from django.contrib import admin
      from django.urls import path
      from Comments.views import test_mptt
    
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('genres/', test_mptt.as_view(),name='gen'),
      ]
    
    # urls测试用例
      from django.urls import reverse,resolve
      from test_plus.test import TestCase
      class TestCommentUrls(TestCase):
    
          def setUp(self):
              pass
    
          # 命名路由解析为string网址
          def test_detail_reverse(self):
              self.assertEqual(reverse('gen'),'/genres/')
    
          # string网址解析到命名路由
          def test_detail_resolve(self):
              self.assertEqual(resolve('/genres/').view_name,'gen')
    
  • views测试用例示例(该测试用例使用了公共的测试基类BaseCommentCase,其他测试用例也可以使用类似方式):

    from django.shortcuts import render
      from Comments.models import Comments
      from django.views.generic.base import View
    
      class test_mptt(View):
          def get(self,request,*args,**kwargs):
              return render(request, 'genre.html', {'genres': Comments.objects.all()})
    
          def get_xx(self):
              return 'xx'
    
    from django.test import RequestFactory
      from .views import test_mptt
      from test_plus.test import TestCase
    
      class BaseCommentCase(TestCase):
    
          def setUp(self):
              self.factory = RequestFactory()
    
      class CommentView(BaseCommentCase):
    
          def setUp(self):
              super().setUp()
              # 下面三行表示直接给view发送一个get请求
              self.view = test_mptt()
              request = self.factory.get('/exam')
              self.view.request = request
    
          def test_get_xx(self):
              self.assertEqual(self.view.get_xx(),'xx')
    
  • python manage.py test即可执行本项目所有测试用例。
  • 测试用例全部通过的页面截图: