Python 框架之 Django (进阶)

URLconf 配置

示例一

Python

1 urlpatterns = patterns('',
2     (r'^hello/$', 'mysite.views.hello'),
3     (r'^time/$', 'mysite.views.current_datetime'),
4     (r'^time/plus/(\d{1,2})/$', 'mysite.views.hours_ahead'),
5     (r'^tag/(\w+)/$', 'weblog.views.tag'),
6 )

示例二

Python

1 urlpatterns = patterns('mysite.views',
2     (r'^hello/$', 'hello'),
3     (r'^time/$', 'current_datetime'),
4     (r'^time/plus/(\d{1,2})/$', 'hours_ahead'),
5 )
6  
7 urlpatterns += patterns('weblog.views',
8     (r'^tag/(\w+)/$', 'tag'),
9 )

示例三

Python

1 urlpatterns = patterns('',
2     (r'^articles/(?P\d{4})/$', views.year_archive),
3     (r'^articles/(?P\d{4})/(?P\d{2})/$', views.month_archive),
4 )
5 if settings.DEBUG:
6     urlpatterns += patterns('',
7         (r'^debuginfo/$', views.debug),
8     )

示例四

Python

1 urlpatterns = patterns('',
2     (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
3     (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
4 )

示例五

Python

1 urlpatterns = patterns('',
2     (r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}),
3     (r'^mydata/(?P\w{3})/(?P\d\d)/$', views.my_view),
4 )

示例六 请求分支

Python

1 def some_page(request):
2     if request.method == 'POST':
3         do_something_for_post()
4         return HttpResponseRedirect('/someurl/')
5     elif request.method == 'GET':
6         do_something_for_get()
7         return render_to_response('page.html')
8     else:
9         raise Http404()

Python

01 from django.http import Http404, HttpResponseRedirect
02 from django.shortcuts import render_to_response
03  
04 def method_splitter(request, GET=None, POST=None):
05     if request.method == 'GET' and GET is not None:
06         return GET(request)
07     elif request.method == 'POST' and POST is not None:
08         return POST(request)
09     raise Http404
10  
11 def some_page_get(request):
12     assert request.method == 'GET'
13     do_something_for_get()
14     return render_to_response('page.html')
15  
16 def some_page_post(request):
17     assert request.method == 'POST'
18     do_something_for_post()
19     return HttpResponseRedirect('/someurl/')
20  
21 # urls.py
22  
23 from django.conf.urls.defaults import *
24 from mysite import views
25  
26 urlpatterns = patterns('',
27     # ...
28     (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
29     # ...
30 )

示例七

Python

01 def my_view1(request):
02     if not request.user.is_authenticated():
03         return HttpResponseRedirect('/accounts/login/')
04     return render_to_response('template1.html')
05 def my_view2(request):
06     if not request.user.is_authenticated():
07         return HttpResponseRedirect('/accounts/login/')
08     return render_to_response('template2.html')
09 def my_view3(request):
10     if not request.user.is_authenticated():
11         return HttpResponseRedirect('/accounts/login/')
12     return render_to_response('template3.html')
13 def requires_login(view):
14     def new_view(request, *args, **kwargs):
15         if not request.user.is_authenticated():
16             return HttpResponseRedirect('/accounts/login/')
17         return view(request, *args, **kwargs)
18     return new_view
19 --------------------------
20 urlpatterns = patterns('',
21     (r'^view1/$', requires_login(my_view1)),
22     (r'^view2/$', requires_login(my_view2)),
23     (r'^view3/$', requires_login(my_view3)),
24 )

示例八:include()
被捕获的 username 变量将传递给被包含的 URLconf,进而传递给那个URLconf中的 每一个 视图函数。

Python

01 from django.conf.urls.defaults import *
02 urlpatterns = patterns('',
03     (r'^(?P\w+)/blog/', include('foo.urls.blog') ,{'blogid': 3}), #包含进foo.urls.blog中,但不会马上执行
04 )
05 # foo/urls/blog.py
06 from django.conf.urls.defaults import *
07 urlpatterns = patterns('',
08     (r'^$', 'foo.views.blog_index'),
09     (r'^archive/$', 'foo.views.blog_archive'),
10 )

模板

django.template.RequestContext

RequestContext 默认地在模板context中加入了一些变量,如 HttpRequest 对象或当前登录用户的相关信息。 当你不想在一系例模板中都明确指定一些相同的变量时,你应该使用 RequestContext

全局模板变量

不论它们存放在哪个物理路径下,只要在你的Python搜索路径中,你就可以在 TEMPLATE_CONTEXT_PROCESSORS 设置里指向它们。 建议你把它们放在应用或者工程目录下名为 context_processors.py 的文件里。

默认的

Python

1 TEMPLATE_CONTEXT_PROCESSORS = (
2     'django.core.context_processors.auth',
3     'django.core.context_processors.debug',
4     'django.core.context_processors.i18n',
5     'django.core.context_processors.media',
6 )

可添加 django.core.context_processors.request

custom_proc: TEMPLATE_CONTEXT_PROCESSORS = (mysite.下面的文件名.custom_proc)

Python

01 from django.shortcuts import render_to_response
02 from django.template import RequestContext
03  
04 def custom_proc(request):
05     "A context processor that provides 'app', 'user' and 'ip_address'."
06     return {
07         'app': 'My app',
08         'user': request.user,
09         'ip_address': request.META['REMOTE_ADDR']
10     }
11  
12 def view_1(request):
13     # ...
14     return render_to_response('template1.html',
15         {'message': 'I am view 1.'},
16         context_instance=RequestContext(request, processors=[custom_proc]))
17  
18 def view_2(request):
19     # ...
20     return render_to_response('template2.html',
21         {'message': 'I am the second view.'},
22         context_instance=RequestContext(request, processors=[custom_proc]))

关闭模板自动转意: {{ data|safe }}
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
auto-escaping 标签的作用域不仅可以影响到当前模板还可以通过include标签作用到其他标签,就像block标签一样。
过滤器参数里的字符串常量的自动转义:{{ data|default:"3 < 2" }}
扩展模板系统:http://djangobook.py3k.cn/2.0/chapter09/

数据模型

http://djangobook.py3k.cn/2.0/chapter10/

访问外键(Foreign Key)值

Python

1 from mysite.apptest.models import Book
2 b = Book.objects.get(id=50)
3 print(b.publisher)
4 p = Publisher.objects.get(name='Apress1')
5 print(p.book_set.all()) #book_set 只是一个 QuerySet,所以它可以像QuerySet一样,能实现数据过滤和分切

访问多对多值(Many-to-Many Values)
多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例

Python

1 b = Book.objects.get(id=1)
2 b.authors.all()

增加额外的Manager方法 我们为Book模型定义了一个title_count()方法

Python

1 class BookManager(models.Manager):
2     def title_count(self, keyword):
3         return self.filter(title__icontains=keyword).count()

Python

1 class Book(models.Model):
2     title = models.CharField(max_length=100)
3     authors = models.ManyToManyField(Author)
4     publisher = models.ForeignKey(Publisher)
5     publication_date = models.DateField()
6     objects = BookManager()
7     def __unicode__(self):
8         return self.title

模型方法与属性执行原始SQL查询
connection和cursor几乎实现了标准Python DB-API

Python

1 >>> from django.db import connection
2 >>> cursor = connection.cursor()
3 >>> cursor.execute("""
4 ...    SELECT DISTINCT first_name
5 ...    FROM people_person
6 ...    WHERE last_name = %s""", ['Lennon'])
7 >>> row = cursor.fetchone()
8 >>> print row

通用视图

呈现静态“关于”页面的URLconf

Python

1 ]
2 from django.conf.urls.defaults import *
3 from django.views.generic.simple import direct_to_template
4  
5 urlpatterns = patterns('',
6     (r'^about/$', direct_to_template, {'template': 'about.html'})
7     (r'^about/(\w+)/$', about_pages),
8 )

对象的通用视图

Python

01 from django.conf.urls.defaults import *
02 from django.views.generic import list_detail
03 from apptest.apptest.models import Publisher
04 def get_books():

你可能感兴趣的:(Python 框架之 Django (进阶))