-
python爬虫之谈谈 django 应用实践
试听地址 https://www.xin3721.com/eschool/pythonxin3721/
python 的 web 框架非常多,比较出名的有 django, flask, tornado。django 作为一个老牌框架,无论是文档还是代码质量都非常高,另外他自带的 admin 后台和一些有用的 app,如果你的需求是做 cms 之类的 web 应用的话,基本上不用开发多少代码就能出一个成品。不过很多新手可能一开始不太适应他的设计模式,遇到问题后基本就懵了,所以这里我按照自己用 django 的经验,写一下 django 的一些应用实践,可能写的比较零散,大家见谅。
整体流程
首先我们得了解下 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 模块
1
2
3
4
5
6
7
8
9
10
11
12
|
def hello_fn(request, name = "World" ): return HttpResponse( "Hellp {}!" . format (name)) class FeedMixin( object ): def get_context_data( self , * * kwargs): context = super ().get_context_data( * * kwargs) context[ "feed" ] = models.Post.objects.viewable_posts( self .request.user) return context class MyFeed(FeedMixin, generic.CreateView): model = models.Post template_name = "myfeed.html" success_url = reverse_lazy( "my_feed" ) |
2. python 的装饰器很好用,也可以用于 views 函数, 比如下面的装饰器用于登录用户的检测
1
2
3
|
@login_required def simple_view(request): return HttpResponse() |
urls 模块
1. urls.py 这个文件将访问的 url 跟 view 模块对应起来,按从上到下的顺序匹配
2. 采用 include 函数可以包含其他 app 的 urls,namespace 参数定义后可以在模板中直接调用,比如
1
2
|
{ % url 'articles' % } url(r '^articles/$' , include(articles.urls), namespace = "articles" ), |
models 模块
1. model 是具有处理数据库的一种面向对象的方法的类,能够让不熟悉数据库语句的程序员也能快速操作数据库
2. 采用面向对象的方式创建类,加上 abstract = True 则为抽象类
1
2
3
4
5
6
7
8
9
10
|
class Postable(models.Model): created = models.DateTimeField(auto_now_add = True ) modified = modified.DateTimeField(auto_now = True ) message = models.TextField(max_length = 500 ) class Meta: abstract = True class Post(Postable): ... class Comment(Postable): ··· |