zoukankan      html  css  js  c++  java
  • django 第三天 视图

    今日内容

    一、url路由分发之include

    项目文件夹下的urls.py文件中的url写法:
        from django.conf.urls import url,include
        from django.contrib import admin
        from app01 import views
        urlpatterns = [
            # url(r'^admin/', admin.site.urls),
            #首页
            url(r'^$', views.base),
    
            url(r'^app01/', include('app01.urls')),
    
            url(r'^app02/', include('app02.urls')),
    
        ]
        
    app01下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'^$', views.app01base),
            url(r'^index/', views.index),
        ]
        
    app02下urls.py内容写法   
        from django.conf.urls import url
        from django.contrib import admin
        from app02 import views
    
        urlpatterns = [
            # url(r'^admin/', admin.site.urls),
            url(r'^$', views.app02base),
            url(r'^home/', views.home),
    
        ]
    
    

    二、视图

    1.请求相关的属性方法

    • (request--HttpRequest对象)
    def index(request): #http相关请求信息---封装--HttpRequest对象
    
        if request.method == 'GET':
            print(request.body)  #获取post请求提交过来的原始数据
            print(request.GET)   #获取GET请求提交的数据
            # print(request.META)  # 请求头相关信息,就是一个大字典
            print(request.path) #/index/ 路径
            print(request.path_info) #/index/ 路径
            print(request.get_full_path())  #/index/?username=dazhuang&password=123
            
            return render(request,'index.html')
        else:
            print(request.body)  # b'username=dazhuang'
            print(request.POST) #获取POST请求提交的数据
            return HttpResponse('男宾三位,拿好手牌!')
    
    

    2.响应相关的方法

    • HttpResponse --- 回复字符串的时候来使用
    • render --- 回复一个html页面的时候使用
    • redirect -- 重定向
    redirect -- 重定向
    	示例:
    	def login(request):
            if request.method == 'GET':
                return render(request,'login.html')
            else:
                username = request.POST.get('username')
                password = request.POST.get('password')
                if username == 'taibai' and password == 'dsb':
                    # return render(request,'home.html')
                    return  redirect('/home/')  #重定向
                else:
                    return HttpResponse('滚犊子,赶紧去充钱!!!')
        #首页
        def home(request):
            return render(request,'home.html')
    

    3.FBV和CBV

    3.1 FBV

    FBV -- function based view
    def home(request):
        print('home!!!')
        return render(request,'home.html')
    

    3.2 CBV

    • 在视图里使用类处理
    • 优点
      • 提高了代码的复用性
      • 用不同的函数针对不同的HTTP方法处理,而不是通过if判断。提高代码的可读性
    CBV  -- class based view
    views.py
    	from django.shortcuts import render,HttpResponse,redirect
        from django.views import View
        class LoginView(View):
            # 通过请求方法找到自己写的视图类里面对应的方法
            def get(self,request):        
                return render(request,'login2.html')
            
            def post(self,request):
                username = request.POST.get('uname')
                password = request.POST.get('pwd')
                print(username,password)
                return HttpResponse('登录成功!')
                
    urls.py
    	url(r'^login2/', views.LoginView.as_view()),
    

    4.CBV通过不同的请求方法找到对应的试图类中的方法

    4.1关键点,反射

        def dispatch(self, request, *args, **kwargs):
            if request.method.lower() in 					self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)  #反射
    

    4.2CBV的dispatch方法

    from django.views import View
    class LoginView(View):
        # GET 
        def dispatch(self, request, *args, **kwargs):
            print('请求来啦')
            ret = super().dispatch(request, *args, **kwargs)
            print('到点了,走人了')
            return ret
        def get(self,request):
            print('get方法执行了')
            return render(request,'login2.html')
        def post(self,request):
            username = request.POST.get('uname')
            password = request.POST.get('pwd')
            print(username,password)
            return HttpResponse('登录成功!')
    

    4.3FBV加装饰器

    def n1(f):
        def n2(*args,**kwargs):
            print('请求之前')
            ret = f(*args,**kwargs)
            print('请求之后')
            return ret
        return n2
    @n1
    def home(request):
        print('home!!!')
        return render(request,'home.html')
    

    4.4CBV加装饰器

    from django.views import View
    from django.utils.decorators import method_decorator
    
    def n1(f):
        def n2(*args,**kwargs):
            print('请求之前')
            ret = f(*args,**kwargs)
            print('请求之后')
            return ret
        return n2
    
    # @method_decorator(n1,name='get') #方式三
    class LoginView(View):
        # GET
        # @method_decorator(n1)  #方式2 给所有方法加装饰器
        def dispatch(self, request, *args, **kwargs):
            # print('请求来啦')
            ret = super().dispatch(request, *args, **kwargs)
            # print('到点了,走人了')
            return ret
    
        # @method_decorator(n1)  #方式1
        def get(self,request):
            print('get方法执行了')
            return render(request,'login2.html')
        def post(self,request):
            username = request.POST.get('uname')
            password = request.POST.get('pwd')
            print(username,password)
            return HttpResponse('登录成功!')
    
  • 相关阅读:
    详解java并发原子类AtomicInteger(基于jdk1.8源码分析)
    可见性、原子性和有序性
    Django基础之简单的前后端交互
    JDK1.8新特性之(三)--函数式接口
    JDK1.8新特性之(一)--Lambda表达式
    JDK1.8新特性之(二)--方法引用
    在IDEA创建类时自动创建作者日期等信息设定
    用batch调用DB2 CLPPlus执行多个SQL文
    windows7 设定开关机事件
    Mybatis显示修改数据库成功,数据库却没有修改
  • 原文地址:https://www.cnblogs.com/xiaobai686/p/12004130.html
Copyright © 2011-2022 走看看