Django---view视图FBV&CBV

一:创建项目和应用:

或者用命令创建:

    1:django-admin.py startproject CBV&FBV

    2: cd CBV&FBV (路径切到该文件夹下)

    3: python3 manage.py startapp app01

二:数据库迁移:

三:创建超级用户(做登录验证需要)

四 :分配路由   urls.py

五:登录验证视图函数 views.py----FBV(functiion Base Views)

方法一:

from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth

# Create your views here.

def index(request):
    user = request.user
    if user.is_authenticated:
        return render(request,'index.html')

    return redirect('/login/')

def log_in(request):

    if request.method == "POST":
        user = request.POST.get('user')
        password = request.POST.get('pwd')

        user_obj = auth.authenticate(username=user,password=password)
        if user_obj:

            auth.login(request,user_obj)
            return redirect('/index/')
    return render(request,'login.html')

方法二:

  或者在setting.py中加入:

    LOGIN_URL=('/login/')

from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required

# Create your views here.

@login_required
def index(request):
    return redirect('/login/')

def log_in(request):

    if request.method == "POST":
        user = request.POST.get('user')
        password = request.POST.get('pwd')

        user_obj = auth.authenticate(username=user,password=password)
        if user_obj:

            auth.login(request,user_obj)
            return redirect('/index/')
    return render(request,'login.html')

方法三:利用session

from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth

# Create your views here.

def index(request):
    if request.session.get('user_info'):
        return render(request,'index.html')
    return redirect('/login/')

def log_in(request):
    if request.method == "POST":
        user = request.POST.get('user')
        password = request.POST.get('pwd')
        user_obj = auth.authenticate(username=user,password=password)
        # if user == 'root' and password=='root1234':  (如果是用自己对数据库表,可以自己做判断。我这是直接用django的user表就直接用auth判断)
        if user_obj:
            request.session['user_info'] = user
            return redirect('/index/')
    return render(request,'login.html')

六:登录验证视图函数 views.py----CBV(Class Base Views)

urls.py:

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index', views.Index.as_view()),
    url(r'login',views.Log_in.as_view()),
]

view.py

方法一:

from django.shortcuts import render,HttpResponse,redirect
from django.views import View
from django.contrib import auth

class Index(View):
    '''先走dispatch再走其它函数'''
    def dispatch(self,request,*args,**kwargs):
        print('before')
        res = super(Index,self).dispatch(request,*args,**kwargs)
        print('after')
        return res

    def get(self,request,*args,**kwargs):
        return render(request,'index.html')

    def post(self,request,*args,**kwargs):
        return HttpResponse(99999)


class Log_in(View):
    def get(self,request,*args,**kwargs):
        return render(request,'login.html')

    def post(self,request,*args,**kwargs):
        user = request.POST.get('user')
        password = request.POST.get('password')
        user_obj = auth.authenticate(username=user,password=password)
        if user_obj:
            request.session['user_info']=user
            return redirect('/index/')

        return render(request, 'index.html')

方法二:单独写个认证类,其余类继承该类

from django.shortcuts import render,HttpResponse,redirect
from django.views import View
from django.contrib import auth

class AuthView(object):
    def dispatch(self, request, *args, **kwargs):
        if not request.session.get('user_info'):
            return redirect('/login.html')
        res = super(AuthView,self).dispatch(request, *args, **kwargs)
        return res
    

class Index(AuthView,View):
    '''先走dispatch再走其它函数'''
   
    def get(self,request,*args,**kwargs):
        return render(request,'index.html')

    def post(self,request,*args,**kwargs):
        return HttpResponse(99999)


class Log_in(AuthView,View):
    def get(self,request,*args,**kwargs):
        return render(request,'login.html')

    def post(self,request,*args,**kwargs):
        user = request.POST.get('user')
        password = request.POST.get('password')
        user_obj = auth.authenticate(username=user,password=password)
        if user_obj:
            request.session['user_info']=user
            return redirect('/index/')
        return render(request, 'index.html')

方法三:装饰器:注意装饰器的写法

from django.shortcuts import render,HttpResponse,redirect
from django.views import View
from django.contrib import auth
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required


@method_decorator(login_required)
class Index(View):
    '''先走dispatch再走其它函数'''
    def get(self,request,*args,**kwargs):
        return render(request,'index.html')

    def post(self,request,*args,**kwargs):
        return HttpResponse(99999)


class Log_in(View):
    def get(self,request,*args,**kwargs):
        return render(request,'login.html')

    def post(self,request,*args,**kwargs):
        user = request.POST.get('user')
        password = request.POST.get('password')
        user_obj = auth.authenticate(username=user,password=password)
        if user_obj:
            request.session['user_info']=user
            return redirect('/index/')
        return render(request, 'index.html')

 装饰器的用法:

装饰器
get, post方法上
class LoginView(View):
    def dispatch(self, request, *args, **kwargs):
        return super(LoginView, self).dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, 'login.html')

    @method_decorator(login_required)
    def post(self, request):
        # request.GET
        # request.POST # 请求头中的:content-type
        # request.body
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == "alex3714":
            # 生成随机字符串
            # 写浏览器cookie: session_id: 随机字符串
            # 写到服务端session:
            # {
            #     "随机字符串": {'user_info':'alex}
            # }
            request.session['user_info'] = "alex"
            return redirect('/index.html')
        return render(request, 'login.html')


dispatch方法上
class LoginView(View):
    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super(LoginView, self).dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        # request.GET
        # request.POST # 请求头中的:content-type
        # request.body
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == "alex3714":
            # 生成随机字符串
            # 写浏览器cookie: session_id: 随机字符串
            # 写到服务端session:
            # {
            #     "随机字符串": {'user_info':'alex}
            # }
            request.session['user_info'] = "alex"
            return redirect('/index.html')
        return render(request, 'login.html')

类上

@method_decorator(login_required, name='get')
class LoginView(View):
    def dispatch(self, request, *args, **kwargs):
        return super(LoginView, self).dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        # request.GET
        # request.POST # 请求头中的:content-type
        # request.body
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == "alex3714":
            # 生成随机字符串
            # 写浏览器cookie: session_id: 随机字符串
            # 写到服务端session:
            # {
            #     "随机字符串": {'user_info':'alex}
            # }
            request.session['user_info'] = "alex"
            return redirect('/index.html')
        return render(request, 'login.html')


特殊:CSRF
Token只能加到dispatch
from django.views.decorators.csrf import csrf_exempt, csrf_protect
class LoginView(View):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(LoginView, self).dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, 'login.html')
    def post(self, request):
        # request.GET
        # request.POST # 请求头中的:content-type
        # request.body
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == "alex3714":
            # 生成随机字符串
            # 写浏览器cookie: session_id: 随机字符串
            # 写到服务端session:
            # {
            #     "随机字符串": {'user_info':'alex}
            # }
            request.session['user_info'] = "alex"
            return redirect('/index.html')
        return render(request, 'login.html')

注:

  form表单提交: GET,POST ***
  Ajax提交数据: GET,POST
     ['get'获取, 'post'创建, 'put'更新, 'patch'局部更新, 'delete'删除, 'head', 'options', 'trace'] -> restful规范

Django请求的生命周期:
wsgi -> 中间件 -> 路由系统 -> 视图函数(ORM,Template,渲染)
- wsgiref
- uwsgi

    

原文地址:https://www.cnblogs.com/mona524/p/7543088.html