昨日内容回顾
路由系统
无名分组
有名分组
默认参数
额外参数
路由分发
项目的路由urls.py里面
app01,app02
1 导入include
2 app文件夹中创建每个app的urls.py文件
3 url(r'^app01/',include('app01.urls'))
url(r'^$',views.home), 匹配首页
今日内容
视图 (类?)
CBV 和 FBV
class base views func base views
# 重写方法
CBV:
from django.views import View
继承类
class LoginView(View):
def dispatch(self,request,*args,**kwargs):
ret = super().dispatch(request,*args,**kwargs)
return ret #别忘了return值
# 重写方法,前后加些内容
def get(self,request):
return render(request,'login.html')
def post(self,request):
print(request.POST)
uname = request.POST.get('username')
pwd = request.POST.get('pwd')
if uname == 'yang' and pwd =='123':
return HttpResponse('用户名或密码错误')
request 请求对象
response 响应对象
urls.py
url(r'^login/',views.LoginView.as_view()),
1 as_view() - view()
2 用户请求到了 view
3 view里面执行了dispatch , 反射找到请求方法对应的自己视图的方法
FBV装饰器
def xxx(func1):
def inner(request,*args,**kwargs):
print('xx1')
ret = func1(request,*args,**kwargs)
print('xxx2')
return ret
return inner
@xxx
def index(request):pass
CBV
from django.utils.decorators import method_decorator
方式3 : (name = "字符串"一种)
@method_decorator(xxx , name='get')
class IndexView(View):
方式 1 :(它可以分发给其他函数)
@method_decorator(xxx)
def dispatch(...):...
方式2 :(直接给)
@method_decorator(xxx)
def get(self,request):pass
request 请求对象
request.body : 得到用户提交数据的原始数据类型 b'username= chao& password =123'
request.GET #<QueryDict: {}>
request.POST #<QueryDict: {}>
request.method 获取请求方法 获得的方法大写的 #GET
request.path_info 获取用户请求路径(不带参数) #/index/
request.get_full_path() 获取除域名之外的全路径,包括请求参数(查询参数query_params)
#/index/?username=chao
request.META 获取请求头的元信息
.META.get('HTTP_USER_AGENT')) #META请求头元信息
.META.get('REMOTE_ADDR')) #客户端IP地址
HTTPResponse('ok') 自动给你加到了body 正常情况不允许的 给整个html文件就渲染成页面了
HTTPResponse(' "<a href='http://www.baidu.com'>百度</a>"') 超链接 浏览器做的
正常为了怕修改 代码 只是文字显示 在评论处
三个方法
HTTPResponse('xxx')
render(request,'index.html',{'name','chao'} ) index.html {{name}}--chao
redirect('/login/') ---给浏览器发送了一个重定向请求,浏览器拿到你要重定向的url,然后自动发送一个ip+端口+路径/login/,的一个请求,后端在配置对应的url('^login/',views.login)
浏览器 发送一个请求给py服务端 服务端重定向redirect发过去 浏览器识别//和302 拼接请求发过来,然后服务端接收,发给浏览器内容
万能的句点号 .
name.xx.xxx li.0 d1.key 不能传参
py locals()
模板语言
{{变量}} {{%逻辑%}}
内置的过滤器
{{变量|过滤器名称:‘过滤其需要的参数’}}
length
filesizeformat
safe :标签字符串,识别成文本,防xss共计 用户提交的数据,塞到了html页面上
date 时间对象|date:'Y-m-d H-i-s'
cut 移除某些内容
truncatechars 字符
truncatewords 单词间隔空格
slice
default 默认值
lower upper
标签
源码
谁调用是谁的类:
def as_view(cls, **initkwargs):
cls
def as_view(cls, ....)
cls = ()
调用的类
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
dispath (分发前后干事情)
handler = get(self. ..)
return handler() = get() = render()
return redirect('/login/') # 重定向 写个相对路径,跳到url
super(HttpResponse, self).__init__(*args, **kwargs)
# return render(request,'index.html')
最终返回都是 通过HttpResponse 返回一个字符串
模板渲染