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视图,参数,别名),
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
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
在分页的时候用,如果没有值,则默认第一页