Python2—0731笔记

6.1 CBV源码

6.2 CBV实现登录验证


CBV源码

背景:用户没有登陆的话,有些网页是不允许直接访问的,只有登陆之后才能直接访问

tips crtl+b 可以看到内置函数源码

from django.views import View中

veiw源码

import logging

from functools import update_wrapper

from django.core.exceptions import ImproperlyConfigured

from django.http import (

HttpResponse, HttpResponseGone, HttpResponseNotAllowed,

HttpResponsePermanentRedirect, HttpResponseRedirect,

)

from django.template.response import TemplateResponse

from django.urls import reverse

from django.utils.decorators import classonlymethod

logger = logging.getLogger('django.request')

class ContextMixin:

"""

A default context mixin that passes the keyword arguments received by

get\_context\_data() as the template context.

"""

extra_context = None

def get\_context\_data(self, **kwargs):

kwargs.setdefault('view', self)

if self.extra_context is not None:

kwargs.update(self.extra_context)

return kwargs

class View:

"""

Intentionally simple parent class for all views. Only implements

dispatch-by-method and simple sanity checking.

"""

http\_method\_names = \['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'\]

def \_\_init\_\_(self, **kwargs):

"""

Constructor. Called in the URLconf; can contain helpful extra

keyword arguments, and other things.

"""

\# Go through keyword arguments, and either save their values to our

\# instance, or raise an error.

for key, value in kwargs.items():

setattr(self, key, value)

@classonlymethod

def as_view(cls, **initkwargs):

"""Main entry point for a request-response process."""

for key in initkwargs:

if key in cls.http\_method\_names:

raise TypeError("You tried to pass in the %s method name as a "

"keyword argument to %s(). Don't do that."

% (key, cls.\_\_name\_\_))

if not hasattr(cls, key):

raise TypeError("%s() received an invalid keyword %r. as_view "

"only accepts arguments that are already "

"attributes of the class." % (cls.\_\_name\_\_, key))

def view(request, \*args, \*\*kwargs):

self = cls(**initkwargs)

if hasattr(self, 'get') and not hasattr(self, 'head'):

self.head = self.get

self.setup(request, \*args, \*\*kwargs)

if not hasattr(self, 'request'):

raise AttributeError(

"%s instance has no 'request' attribute. Did you override "

"setup() and forget to call super()?" % cls.\_\_name\_\_

)

return self.dispatch(request, \*args, \*\*kwargs)

view.view_class = cls

view.view_initkwargs = initkwargs

\# take name and docstring from class

update_wrapper(view, cls, updated=())

\# and possible attributes set by decorators

\# like csrf_exempt from dispatch

update_wrapper(view, cls.dispatch, assigned=())

return view

def setup(self, request, \*args, \*\*kwargs):

"""Initialize attributes shared by all view methods."""

self.request = request

self.args = args

self.kwargs = kwargs

def dispatch(self, request, \*args, \*\*kwargs):

\# Try to dispatch to the right method; if a method doesn't exist,

\# defer to the error handler. Also defer to the error handler if the

\# request method isn't on the approved list.

if request.method.lower() in self.http\_method\_names:

handler = getattr(self, request.method.lower(), self.http\_method\_not_allowed)

else:

handler = self.http\_method\_not_allowed

return handler(request, \*args, \*\*kwargs)

def http\_method\_not_allowed(self, request, \*args, \*\*kwargs):

logger.warning(

'Method Not Allowed (%s): %s', request.method, request.path,

extra={'status_code': 405, 'request': request}

)

return HttpResponseNotAllowed(self.\_allowed\_methods())

def options(self, request, \*args, \*\*kwargs):

"""Handle responding to requests for the OPTIONS HTTP verb."""

response = HttpResponse()

response\['Allow'\] = ', '.join(self.\_allowed\_methods())

response\['Content-Length'\] = '0'

return response

def \_allowed\_methods(self):

return \[m.upper() for m in self.http\_method\_names if hasattr(self, m)\]

class TemplateResponseMixin:

"""A mixin that can be used to render a template."""

template_name = None

template_engine = None

response_class = TemplateResponse

content_type = None

def render\_to\_response(self, context, **response_kwargs):

"""

Return a response, using the \`response_class\` for this view, with a

template rendered with the given context.

Pass response_kwargs to the constructor of the response class.

"""

response\_kwargs.setdefault('content\_type', self.content_type)

return self.response_class(

request=self.request,

template=self.get\_template\_names(),

context=context,

using=self.template_engine,

**response_kwargs

)

def get\_template\_names(self):

"""

Return a list of template names to be used for the request. Must return

a list. May not be called if render\_to\_response() is overridden.

"""

if self.template_name is None:

raise ImproperlyConfigured(

"TemplateResponseMixin requires either a definition of "

"'template\_name' or an implementation of 'get\_template_names()'")

else:

return \[self.template_name\]

class TemplateView(TemplateResponseMixin, ContextMixin, View):

"""

Render a template. Pass keyword arguments from the URLconf to the context.

"""

def get(self, request, \*args, \*\*kwargs):

context = self.get\_context\_data(**kwargs)

return self.render\_to\_response(context)

class RedirectView(View):

"""Provide a redirect on any GET request."""

permanent = False

url = None

pattern_name = None

query_string = False

def get\_redirect\_url(self, \*args, \*\*kwargs):

"""

Return the URL redirect to. Keyword arguments from the URL pattern

match generating the redirect request are provided as kwargs to this

method.

"""

if self.url:

url = self.url % kwargs

elif self.pattern_name:

url = reverse(self.pattern_name, args=args, kwargs=kwargs)

else:

return None

args = self.request.META.get('QUERY_STRING', '')

if args and self.query_string:

url = "%s?%s" % (url, args)

return url

def get(self, request, \*args, \*\*kwargs):

url = self.get\_redirect\_url(\*args, \*\*kwargs)

if url:

if self.permanent:

return HttpResponsePermanentRedirect(url)

else:

return HttpResponseRedirect(url)

else:

logger.warning(

'Gone: %s', request.path,

extra={'status_code': 410, 'request': request}

)

return HttpResponseGone()

def head(self, request, \*args, \*\*kwargs):

return self.get(request, \*args, \*\*kwargs)

def post(self, request, \*args, \*\*kwargs):

return self.get(request, \*args, \*\*kwargs)

def options(self, request, \*args, \*\*kwargs):

return self.get(request, \*args, \*\*kwargs)

def delete(self, request, \*args, \*\*kwargs):

return self.get(request, \*args, \*\*kwargs)

def put(self, request, \*args, \*\*kwargs):

return self.get(request, \*args, \*\*kwargs)

def patch(self, request, \*args, \*\*kwargs):

return self.get(request, \*args, \*\*kwargs)


CBV实现登录验证

views.py

代码

import json

from django.shortcuts import render,HttpResponse,redirect

from django.views import View

from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

from demo01 import models

def Test(request):

    data_li=\['john', 'paul', 'george', 'ringo'\]

    data\_obj\_li=models.UserInfo.objects.all()

    p=Paginator(data\_obj\_li,2)

    print('数据总数:',p.count)

    print('数据页数:',p.num_pages)

    print('数据页数:',p.page_range)

    print('是否有下一页:',p.page(2).has_next())

    print('是否有上一页:',p.page(2).has_previous())

    print('是否有其他页:',p.page(2).has\_other\_pages())

    print('下一页的页码:',p.page(2).next\_page\_number())

    print('上一页的页码:',p.page(2).previous\_page\_number())

    request.session\['XXX'\]=data_li

    page=int(request.GET.get('page',1))

    try:

        data\_obj\_li = p.page(page)

    except PageNotAnInteger:

        data\_obj\_li = p.page(1)

    except EmptyPage:

        data\_obj\_li = p.page(p.num_pages)

    # return HttpResponse('ok')

    return render(request,'test.html',locals())

def Session(request):

    get_session=request.session.get('XXX',False)

    if get_session:

        cookie_content=request.COOKIES

        session_content=request.session

    return render(request,'session.html',locals())

    # return HttpResponse(json.dumps(get_session))

def Del_Se(request):

    request.session.clear()

    get_session=request.session.get('XXX',11)

    return HttpResponse(json.dumps(get_session))

urls.py

代码

"""pag URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:

    https://docs.djangoproject.com/en/1.11/topics/http/urls/

Examples:

Function views

    1. Add an import:  from my_app import views

    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')

Class-based views

    1. Add an import:  from other_app.views import Home

    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')

Including another URLconf

    1. Import the include() function: from django.conf.urls import url, include

    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))

"""

from django.conf.urls import url

from django.contrib import admin

from demo01 import views

from django.views import View

urlpatterns = [

    url(r'^admin/', admin.site.urls),

    url(r'^test', views.Test),

    url(r'^session', views.Session),

    url(r'^del_session', views.Del_Se),

    url(r'^login', views.login_demo),

    url(r'^login_demo', views.Index.as_view()),

    url(r'^index_demo', views.Index.as_view()),

    # url(r'^login_demo', views.View.as_view().view),

    url(r'^index_demo', views.Index.as_view()),

    url(r'^index', views.index_demo),

]

运行

访问127.0.0.1:8000/index_demo

![](https://oscimg.oschina.net/oscnet/9f0011b688dfe16b7f780f142464211979c.jpg)

访问127.0.0.1:8000/login_demo

![](https://oscimg.oschina.net/oscnet/492ea0f253a951ce1d85cb8f4987bc7c464.jpg)

登陆

![](https://oscimg.oschina.net/oscnet/5007bf410ea0a0137311f140b433cd741de.jpg)

再访问127.0.0.1:8000/index_demo

![](https://oscimg.oschina.net/oscnet/15df39a5a74cafad8f4430e318ea3db3148.jpg)

不需要再输入密码

转载于:https://my.oschina.net/u/3959701/blog/3081607

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值