Django 视图总结

### 视图

#### 1. FBV CBV

定义;

```python
from django.views import View

class AddPublisher(View):

def get(self,request):
return response

def post(self,request):
return response

```

使用:

from app01 import views

url(r'add_publulisher',views.AddPublisher.as_view() )

#### 2. as_view的流程:

1. 程序执行时,会执行as_view() ——》 返回view函数

​ url(r'add_publulisher', view )

2. 请求到来的时候,执行view函数:

1. 实例化AddPublisher(*args,**kwargs) ——》 self

2. self .request = request

3. 执行self.dispatch() ——》 AddPublisher中有就执行,没有就找View中的dispatch()

1. 判断请求方法 ——》 http_method_names [ ]

1. 允许

通过反射获取到当前请求方式对应的方法(get/post) ——》 handler

2. 不允许

```
self.http_method_not_allowed ——》 handler
```

2. 执行handler方法 ——》返回 response

#### 3. 加装饰器的方法

CBV

```
from django.utils.decorators import method_decorator 方法装饰器
```

1. 加在方法上

```
@method_decorator(timer)
def get(self, request):
```

2. 加在类上

```python
@method_decorator(timer,name='post')
@method_decorator(timer,name='get')
class AddPublisher(View):
```

3. 加在dispatch上

```python
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs):
ret = super().dispatch(request, *args, **kwargs)
return ret

@method_decorator(timer,name='dispatch')
class AddPublisher(View):
```

 

 

#### 4. request

1. request.method ——》 请求方式
2. request.GET ——》 URL上携带的参数 {}
3. request.POST ——》 POST请求提交的数据 {}
4. request.body ——》 请求体中的数据 字节
5. request.FILES ——》 上传的文件
1. form表单编码方式 enctype="multipart/form-data"
2. POST {% csrf_token %}
3. file_obj.chunks()
6. request.META ——》 请求头 全大写 HTTP_ - ——》 _
7. request.path_info ——》 路径 不包含 IP和端口 、参数
8. request.COOKIES ——》 cookie
9. request.session ——》 session
10. request.get_full_path() ——》 完整的路径信息 不包含 IP和端口 包含参数
11. request.is_ajax() ——》 是否是ajax请求
12. request.get_host() ——》 获取主机的IP和端口

 

 

#### 5. response

1. HttpResponse('字符串') ——》 返回字符串 Content-Type : 'text/html'

2. render(request,'模板的文件名',{k1:v1}) ——》 返回一个完整的HTML页面

3. redirect('要跳转的地址') ——》 重定向 Location:'要跳转的地址

ret = HttpResponse('ok') ret['Location'] = '/index/' return ret

4. ```
from django.http.response import JsonResponse

JsonResponse(字典) # Content-Type: 'application/json'
JsonResponse(非字典类型,safe = False)
```

 

 

### 路由系统

https://www.cnblogs.com/maple-shaw/articles/9282718.html

#### 1. 正则表达式

r''

最开始的/不用加

从上到下进行匹配 匹配成功下面就不在继续 ——》 ^ $

[abc] [0-9] {} ? + * . \d \w

#### 2. 分组和命令分组

分组 ()

```
url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog),
```

​ 分组的结果会当做位置参数 ——》 传递给视图函数

命名分组 (?P<name>)

```
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog),
```

​ 分组的结果会当做关键字参数 ——》 传递给视图函数

#### 3. include

路由分发

```Python
from django.conf.urls import url,include
from app01 import views

urlpatterns = [

url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
```

#### 4. URL命名和反向解析

##### 静态地址

命名

```
url(r'^blog/$', views.blogs, name='xxxx'),
```

使用:

​ 模板

​ {% url 'xxxx' %} ——》 '/blog/' 一个完整的URL

​ py文件

 

 

​ from django.urls import reverse

​ reverse('xxxx') ——》 '/blog/'

 

##### 分组

命名

```
url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog,name='blog' ),
```

使用:

​ 模板

​ {% url 'blog' ‘2019’ ‘12’ %} ——》 '/blog/2019/12/' 一个完整的URL

 

 

 

​ py文件

​ from django.urls import reverse

​ reverse('blog',args=('2018','02')) ——》 '/blog/2018/02'

 

 

# 1.写死的话, 修改代码时需要把, 所有路径找出来改成新的路径
# login_url = 'myblog/login/'
# 2、利用reverse函数反转url:找到urls.py中name='login'的路径
# login_url = reverse('login')
# 3、当reverse需要传参时
login_url = reverse('detail', kwargs={'article_id': 1, 'eid': 2})
return redirect(login_url)

path('detail/<article_id>/<eid>/', article_detail, name='detail')

 

 

 

 

命名

```
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog,name='blog' ),
```

使用:

​ 模板

​ {% url 'blog' ‘2019’ ‘12’ %} ——》 '/blog/2019/12/' 一个完整的URL

​ {% url 'blog' month='09' year='2016' %} '/blog/2016/09/'

​ py文件

​ from django.urls import reverse

​ reverse('blog',args=('2018','02')) ——》 '/blog/2018/02'

​ reverse('blog', kwargs={'year': '2020', 'month': '03'}) ——》 /blog/2020/03/

 

 

#### 5. namespace

```python
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls',namespace='app01')),
url(r'^app02/', include('app02.urls',namespace='app02')),

]
```

{% url 'namespace:name' 参数 %}

reverse( 'namespace:name' ,arrgs=(),kwargs={} )

 

posted @ 2019-04-10 16:42  呼呼嘻嘻  阅读(109)  评论(0编辑  收藏  举报