- A+
python 的 web 框架非常多,比较出名的有 django, flask, tornado。django 作为一个老牌框架,无论是文档还是代码质量都非常高,另外他自带的 admin 后台和一些有用的 app,如果你的需求是做 cms 之类的 web 应用的话,基本上不用开发多少代码就能出一个成品。不过很多新手可能一开始不太适应他的设计模式,遇到问题后基本就懵了,所以这里我按照自己用 django 的经验,写一下 django 的一些应用实践,可能写的比较零散,大家见谅。
在这里我还是要介绍一下小编的学习交流的群,有什么不懂的问题,都可以在群里踊跃发言,需要啥资料随时在群文件里面获取自己想要的资料。这个python群就是:588090942小编期待大家一起进群交流讨论,讲实话还是一个非常适合学习的地方的。各种入门资料啊,进阶资料啊,框架资料啊 爬虫等等,都是有的,风里雨里,小编都在群里等你
整体流程
首先我们得了解下 django 这个框架整体的处理流程,假设我们采用 nginx + uwsgi + django 的 web server 模式
1. 一个请求过来后,首先经过 nginx 做反向代理,将请求转发到 uwsgi (python 用 wsgi 这种协议来解析 http 请求,uwsgi 是一个 解析 wsgi 的应用),uwsgi 再将解析过的数据传到 django。
2. django 收到请求后,首先会经过一组全局的中间件 (middleware),调用 process_request 作为预处理,比如解析用户状态,检验 csrf_token (post 请求),如果有问题,则直接返回 response,不再调用 view 函数。否则,调用 process_view ,如果没问题进入 view 函数。
3. 进入 view 函数后开发者可以写自己的逻辑,比如操作数据库,更新缓存,最后返回一个 response。
4. 接下来 跳出 view 函数,重新进入 middleware,调用 process_response,对 response 做些最后的修饰,返回给用户。
views 模块
1. view 不仅可以用函数,也可以用通用视图类(generic_view),好处是:代码更加清晰,可以复用继承,并且结合 mixin 能够开发更加灵活的 view 模块
3. django 表对应关系有一对一(OneToOneField),一对多 (ForeignKey),多对多 (ManyToManyField),其中 多对多的模式通过创建一个中间表来实现。
不过对于高并发的应用来说外键不是很推荐。
forms 模块
1. 前端传上来一个表单的值,但是没法确认这些值是不是为空,是不是类型正确,这个时候当然可以自己一个个值判断,也可以采用 forms 模块去做验证,用过 django-rest-framework 的同学会知道和里面的 serializers 是同一个概念
settings 模块
1. 所有的 settings 默认值都在这里面能找到,https://github.com/django/django/blob/master/django/conf/global_settings.py
2. 上线的时候记得把 DEBUG 改成 False, 然后加上 ALLOWED_HOSTS
3. MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL 这几个之前经常搞混,其实可以分为两类,MEDIA_ROOT 指的是上传文件的目录,MEDIA_URL 指的是前缀名,http://example.com/media/, 其中的media 就是 MEDIA_URL, 同样,STATIC_ROOT 指的是静态文件的目录,一般放 css, js 之类,STATIC_URL 值得是前缀名,http://example.com/static/。
4. 一般部署上线的时候,用 nginx 直接渲染静态文件
contrib 模块
1. 这里面的模块是 django 自带的 apps,用的比较多的有 admin, auth, sessions
2. admin 模块其实就是 django 的后台
3. auth 模块就是用户模块,功能上比较齐全,基本上可以基于这个模块做扩展。
4. session 模块结合 auth ,用来做用户的登录状态,对于大型网站来说,session 的存储可能是个问题,django 也提供了不同的 backends,支持 db, cache, file 等存储方式。
middleware 模块
1. django 自带的 middlreware 对于普通网站的需求已经蛮完善了,比如 CsrfMiddleware , HttpMiddleware。
2. 如果有自己的需求,也可以自定义,比如记录详细 log 信息,LogMiddleware,还有跨域的 CorsMiddleware。
其他
1. 网上有人说 django 只能做小网站,不支持大的并发,其实这个说法还是很片面的。django 自身只是一个框架,如果网站请求处理慢,很多情况下是自己写的逻辑没有优化。确认是 django 框架问题的话,django 虽然设计上略复杂,但是很多模块还是可以拆分去自定义的。最后实在不济,靠增加机器数量也能顶一阵。
2. django 的国际化模块做的很不错
3. setting 文件可分成 product, 和 dev 两份,根据开发环境和生产环境不同引入不同的 setting 文件。
4. django-celery 用来执行异步任务
5. django 的插件非常多,rosarior/awesome-django