总结一些 Django 开发的小经验。先说一些最最基础的吧。

使用 virtualenv 隔离开发环境

使用 pip 管理项目依赖,主要就是一个小技巧,使用 pip freeze > requirements.txt 来保存依赖的模块和版本

使用 gitignore.io 这个网站提供的 .gitignore 文件管理代码库文件

打包和发布

项目的打包和发布用的 Docker,Django 项目的 Dockerfile 特别简单:

1
2
3
4
5
6
7
FROM python:3.5
COPY ./requirements.txt /src
WORKDIR /src
RUN pip install -r requirements.txt
COPY . /src
EXPOSE
CMD uwsgi --http :--wsgi-file<path/to/wsgi.py>

这一个 Dockerfile 模板可以通吃 80% 的 Django 项目了。

日志配置

既然用 Docker,就放弃了把日志写入文件,直接写到标准输出。

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
# settings.py 
# ...
LOGGING = {
    'version'1,
    'disable_existing_loggers'False,
    'formatters': {
        'verbose': {
            'format''[application] %(levelname)s %(asctime)s %(module)s %(message)s'
        }
    },
    'handlers': {
        'console': {
            'level''DEBUG',
            'class''logging.StreamHandler',
            'stream': sys.stdout,
            'formatter''verbose'
        },
    },
    'loggers': {
        'app': {
            'handlers': ['console'],
            'level''DEBUG',
            'propagate'True,
        },
    },
}

新版本的 uwsgi 已经可以把 webapp 的日志收集起来输出到标准输出里面了。如果需要收集、管理日志的话,就是用 Docker 日志收集工具,直接收集 Docker 容器的日志即可。

自动化测试

既然是纯后端项目,工程师完全可以通过自动化测试来检测自己的代码。Django 本身对测试提供了很好的支持,可以通过 sqlite 来搭建测试数据库,还有基于内存的缓存,做测试不会增加对其他系统的依赖。开发起来事半功倍。

除了要写自动化测试代码,还要能统计测试覆盖率。目前我们用的是 coverage.py 这个工具,说实话没有 node.js 的 istanbul 好用,输出的报告没有 Istanbul 详细和易读。不过用来检查 “死代码” 还是够用的。

针对 http 代码的测试

有些项目需要对接的第三方系统比较多,比如微信认证、支付、短信等常见的,可能还有其他一些垂直业务领域的系统。这部分接口对接的代码,也应该纳入到测试当中,毕竟 Python 作为脚本语言,代码很容易出现错误。

这块一般是用 responses 这个模块来 mock http 请求。

定时任务

有一些 Django 项目需要做一些定时任务。首先,绝对不用 linux 内置的 crontab。主要的问题还是维护的成本高,没准哪天就把这个配置给忘了。

我们现在方式都是借助 Django Command 的功能,将定时任务封装成一个 command。在这个 command 里面运行一个 scheduler。就像下面这样:

1
2
3
4
5
6
7
8
9
import schedule
from django.core.management.base import BaseCommand
class Command(BaseCommand):
    def handle(self*args, **kwargs):
        schedule.every(45).minutes.do(do_this)
        schedule.every().day.at('04:00').do(do_that)
        while True:
            schedule.run_pending()
            time.sleep(1)

Django一些开发经验的更多相关文章

  1. django搭建一个小型的服务器运维网站

    前言   不管是运维还是开发抑或是测试,工作中不免会和Linux服务器打交道,常见的操作譬如:查看CPU或内存状态.查看和修改服务器时间.查看或者修改服务器配置文件.实时查看或回看系统的日志.重启服务 ...

  2. Backend事后诸葛亮

    事后诸葛亮 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件想解决初学编程语言的入门困难.定义的不算太清楚,没有仔细地调查用户入门的困难之处. ...

  3. Django博客开发实践,初学者开发经验

    python,Django初学者,开发简易博客,做了一下笔记,记录了开发的过程,功力浅薄,仅供初学者互相 交流,欢迎意见建议.具体链接:Django博客开发实践(一)--分析需求并创建项目 地址:ht ...

  4. 无开发经验,初学python

    1.无开发经验,初学python   如果你不会其他语言,python是你的第一门语言: A Byte of Python (简明python教程,这个有中文版简明 Python 教程)是非常好的入门 ...

  5. 如何简单便捷的搭建一个网站 - 基于Django

    一.所需工具以及相关环境 1. 系统:win7,win8.1,win10(亲测可用 - 本文为win7,64位) 2. 本文使用的版本是: 1)python-2.7.11[百度云盘分享:http:// ...

  6. 第四章:Django 的模板系统(转)

    在之前的章节中,你可能觉得例子中视图返回文本有点不妥.即是, HTML 是直接写在 Python 代码中的.     这种做法会导致这些问题:     要做任何设计上的更改就必须改写 Python 代 ...

  7. 【秒懂】号称最为简明实用的Django上手教程

    号称最为简明实用的Django上手教程 作者:白宁超 2017年8月24日09:37:35 摘要:Django的学习教程也是分门别类,形式不一.或是较为体系的官方文档,或者风格自由的博客文档,或者偏向 ...

  8. django 实现同一个ip十分钟内只能注册一次(redis版本)

    上一篇文章,django 实现同一个ip十分钟内只能注册一次 的时候,我们在注册的时候选择使用的使我们的数据库来报错我们的注册的ip信息,可是如果数据量大,用户多的时候,单单靠我们的数据库 来储存我们 ...

  9. Django简介--Django从入门到精通系列教程

    该系列教程系个人原创,并同步发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

随机推荐

  1. 20165230 2017-2018-2 《Java程序设计》第7周学习总结

    20165230 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十一章 JDBC与MySQL数据库 本周了解了如何在Java程序中使用JDBC语提供的AP ...

  2. SolrJ API 官方文档最佳实践

    以下内容译自Solr Wiki官方文档,版权没有,随意转载. Solrj 是一个访问solr的Java客户端.它提供了一个java接口用于添加更新和查询solr索引.本页面介绍SolrJ最新版本1.4 ...

  3. 【API】Mysql UDF BackDoor

    1.MySQL UDF是什么 UDF是Mysql提供给用户实现自己功能的一个接口,为了使UDF机制起作用,函数必须用C或C ++编写,并且操作系统必须支持动态加载.这篇文章主要介绍UDF开发和利用的方 ...

  4. Intel大坑之一:丢失的SSE2 128bit/64bit 位移指令,马航MH370??

    缘由 最近在写一些字符串函数的优化,兴趣使然,可是写的过程中,想要实现 128bit 的按 bit 逻辑位移,遇到了一个大坑,且听我娓娓道来. 如果要追究标题,更确切的是丢失的SSE2 128 bit ...

  5. Python基础三(选择,循环)

    序 首先我们知道程序的执行有三种结构:顺序.选择.循环三种结构,而为了方便我们书写和多次利用我们就需要把一段代码封装器来,这就是方法.今天我就说的是程序的基本结构的格式和方法. 注:所有的程序都可以通 ...

  6. android studio 解决avd启动问题 ----waiting for target device come online

    android studio 模拟器打不开,一直停留在第三方.waiting for target  device  come online 问题解决方法 方法1.Android Emulator 未 ...

  7. python随笔(三)

    在对字符串的操作中,s[::-1]表示将字符串逆序输出. 字符串本身不能改变(管理者而非所有者) 列表的内容是可以改变的,且列表的内容可以不仅仅是字符串.对于一个列表,注意b=a和b=a[:]的区别. ...

  8. Django render函数

    render() 此方法的作用---结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象. 通俗的讲就是把context的内容, 加载进templates中定义 ...

  9. 域名解析A记录与CNAME有什么区别?

    A记录是直接将域名指向某个IP,如果您的主机IP不常变动就建议使用A记录.而别名解析是先将域名解析到主机别名再转跳到IP这样主机IP改变了不用重新解析.如果主机IP常变建议用别名解析 A记录正规些.独 ...

  10. more命令 less命令

    more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作.more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行), ...