## FBV和CBV
### FBV Function Base View
處理方法是一個函數
~~~
urlpatterns = patterns('',
url(r'^home/$', 'learn.views.index'),
# error page
url(r'^\w+/$', 'learn.views.errorpage'),
)
~~~
### CBV Class Base View
處理方法是一個類,使用`className.as_view()`,進行指定。
~~~
urlpatterns = patterns('',
url(r'^home/', views.Home.as_view()),
# error page
url(r'^\w+/$', 'learn.views.errorpage'),
)
~~~
views中的類,分別處理不同方式的請求,在處理請求之前(pre-handler)和之后(post-handler)可定義不同的處理。類似于對請求的裝飾器。
~~~
class Home(View):
# 處理進來的請求,get還是post, 通過反射找到各種方法
def dispatch(self, request, *args, **kwargs):
print('before')
result = super(Home, self).dispatch(request, *args, **kwargs)
print('after')
return result
def get(self, request):
print(request.method)
return render(request, 'home.html')
def post(self, request):
print(request.method)
return render(request, 'home.html')
~~~
---
路由定義URL(網址)對應的視圖函數 (即規定 訪問什么網址對應什么內容)
* 靜態路由
* 動態路由
* 路由分發 多級URL
* 自定義路由
### URL配置
Django 1.7.x 及以下,使用`字符串`方式引用視圖函數 [demo下載][1]
```python
#coding: utf-8
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# 路由分發
url(r'^admin/', include(admin.site.urls)),
# 靜態路由
url(r'^$', 'learn.views.index'),
url(r'^home/$', 'learn.views.index'),
# 動態路由
url(r'^blog/\w*/?$', 'learn.views.blog'),
## 通過位置獲取動態路由中的參數
url(r'^add/(\d+)/(\d+)/$', 'learn.views.add'),
## 通過變量名獲取動態路由中的參數
url(r'^plus/(?P<first_number>\d+)/(?P<second_number>\d+)/$', 'learn.views.plus'),
# error page
url(r'^\w+/$', 'learn.views.errorpage'),
)
```
Django 1.8.x及以上,Django 官方鼓勵(或說要求)先引入,再使用 [demo下載][2]
```python
from django.conf.urls import include, url
from django.contrib import admin
from learn import views as learn_views
urlpatterns = [
# 路由分發
url(r'^admin/', include(admin.site.urls)),
url(r'^admin/', include('app.urls')),
# 靜態路由
url(r'^$', learn_views.index),
url(r'^home/$', learn_views.index),
# 動態路由
url(r'^blog/\w*/?$', learn_views.blog),
## 通過位置獲取動態路由中的參數
url(r'^add/(\d+)/(\d+)/$', learn_views.add),
## 通過變量名獲取動態路由中的參數
url(r'^plus/(?P<first_number>\d+)/(?P<second_number>\d+)/$', learn_views.plus),
# error page
url(r'^\w+/$', learn_views.errorpage),
]
```
[1]:http://files.cnblogs.com/files/hiyang/demo_url_view_165.tar.gz
[2]:http://files.cnblogs.com/files/hiyang/demo_url_view_181.tar.gz