zoukankan      html  css  js  c++  java
  • 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

        

  • 相关阅读:
    Use Study Groups to Support Learning
    “开闭”原则(OpenClosed principle, OCP)
    我的E72i 开发
    conlution of daily work
    appstore相关查询链接
    sqlite3.0不支持的sql属性
    iOS sdk 运行时函数
    自动化测试部分
    ios下获取mac地址修正版
    修改mac os host
  • 原文地址:https://www.cnblogs.com/mona524/p/7543088.html
Copyright © 2011-2022 走看看