django 视图

django 的视图 即为view
CBV 和 FBV
FBV (function based view)
CBV (class based view )
CBV的写法:
from django.view import View
class Add Publisher(View):
def get(self,request):
return render
def post(self,request):
return rennder
 
在url中的使用:
url(r"^add_publisher/",views.AddPublisher.as_view())
CBV简单的流程:
1 Addpublisher.as_view ------>> view的函数  
2当请求到来的时候才执行view函数
1 实例化AppPublisher ---->>self
2 self.request = request
3执行self.dispatch(request,*args,**kwqrgs)
1请求方式是否被允许
handler = getattr(self,request.as_view())
通过反射来获取对应的方法
2执行获取到的方法 get(request) 或者post(request)
3 得到HttpResponse对象,返回给self.dispath
4,得到HttpResponse对象,返回django对象
 
 
装饰器的用法:
1,给get 和 post加普通的装饰器
使用method_decorator
使用时导入
1,给get和post加method_decorator加上
2#(这里比较方便)
def dispatch(self, request, *args, **kwargs):
    print('执行get方法之前')
    ret = super(Addclass, self).dispatch(request,*args,**kwargs)
    print('执行get方法之后')
    return ret
dispatch方法来做装饰器,给他加就可以了
3在类上加装饰器(必须这么加)
# from django.utils.decorators import method_decorator
#
# @method_decorator(wrapper,name='post')
# @method_decorator(wrapper,name='get')
class 名字
request:
request.method ----->>请求方式8种 GET,POST,PUT,DELETE,OPTIONS
request.GET ----->> 字典 url 上携带的参数
rquest.POST ----->>> form 表单通过POST请求提交的数据
 
request,   类
request.path_info   返回用户访问url ,不包括域名
request.body  byte类型request.POST 的数据是从body里面提取的
request.scheme  请求方案的字符串(http https)
files:
注意在html中的使用
<form action="" method="post"  enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="file_name"></inpt>
    <button type="submit">提交</button>
enctype必须要写的   还有file_name
在views中
def upload(request):
    if request.method == 'POST':
        print(request.POST)
        print(request.FILES)
        file_obj = request.FILES.get('file_name') 获取到文件的对象
        with open(file_obj.name,'wb')as f:
            for chunk in file_obj.chunks():   #内存中获取
                f.write(chunk)
    return render(request,'upload.html')
request.get_host()   获取host
request.get_ul_path()   返回path url中的如"/music/bands/the_beatles/?print=true"
request.is_secure()      如果返回的是True  即是https返回的
request.is_ajax()         是否使用ajax技术
 
 
ret = HttpResponse('OK')
    print(ret.content)     响应的内容
    print(ret.charset)   响应内容的编码
    print(ret.status_code)   响应的状态码
reponse:
from django.shortcuts import  render,HttpResponse,redirect
HttpResponse      ---->>>浏览器显示字符串
render(request,'模板名字',{})   ___>>> 返回整个页面
redirecr(URL)      _____>>>跳转 重定向 location:url
 
jsonResponse
from django.http.response import JsonResponse
JsonnResponse(data)
content_type: application/json  这样使用在浏览器的头部会显示json,如果使用
另外的json的话会需要转化
 
基本的格式:
from django.conf.urls import url
urlpatterns = [
     url(正则表达式, views视图,参数,别名),
]
实例:
from django.conf.urls import url
from . import views
 
urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
在2.0中将url改为了 path
注意事项:
urlpatterns的元素从上向下匹配正则^  和 $ 确保唯一
若要在url中捕获一个值,只需要在他的周围放置一对括号(分组括号)
不需要再前边添加括号
每个正则面前加^  后边加$
 
是否开启url方问地址后面不为/跳转至带有的/的路径的配置项
APPEND_SLASH=True    如果改为false  则必须要加/
使用正则匹配,需要满足正则才能执行后边的视图函数
在使用()时候注意括号中的事变量:*arg,**kwargs
url(r'^articles/([0-9]{4})/([0-9]{2})/', views.article_detail),
可以在页面中获取id的方法;
href="/del_class/{{ cls.id }}"
在url中:
url(r'^add_class/(\d+)/',views.Addclass.as_view())
在函数中:
需要传输相应的变量,并且不用使用get获取值
使用分组时,无名的用arg取,有名的kwarg
使用函数时候的默认值:
# urls.py中
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]

# views.py中,可以为num指定默认值
def page(request, num="1"):
    pass
在分页的时候用,如果没有值,则默认第一页
 
 
 
 

posted @ 2018-09-23 16:05  又见芳踪  阅读(135)  评论(0编辑  收藏  举报