zoukankan      html  css  js  c++  java
  • Django视图之CBV,FBV

    一. CBV

     1.views.py

    from django.shortcuts import render,HttpResponse
    
    #### ------CBV部分
    from django.views import View
    
    class Login(View):    #(继承 View 这个类)
        
        #提交方式(常用的)
        """
            get     查
            post    创建
            put     更新
            delete  删除
        """
    
    
        def dispatch(self, request, *args, **kwargs):
            print('before')
            obj = super(Login,self).dispatch(request,*args,**kwargs)
            print('after')
            return obj
    
    
        def get(self,request):
    
            return render(request,'login.html')
    
    
        def post(self,request):
    
            print(request.POST.get('user'))
    
            return HttpResponse('Login.post')
    View Code

     2.login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>CBV</title>
    </head>
    <body>
    
        <form method="POST" action="/login.html">
            <input type="text" name="user"/>
            <input type="submit" value="提交"/>
        </form>
    
    </body>
    </html>
    View Code

    PS:

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

     功能:

    a.基本使用

    b.基于dispatch和继承实现用户登录代码

    c.装饰器

    from django.utils.decorators import method_decorator
    
    1.--------- 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(test)
        def post(self, request):
            # request.GET
            # request.POST # 请求头中的:content-type
            # request.body
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if user == 'tom' and pwd == "123":
                # 生成随机字符串
                # 写浏览器cookie: session_id: 随机字符串
                # 写到服务端session:
                # {
                #     "随机字符串": {'user_info':'tom}
                # }
                request.session['user_info'] = "tom"
                return redirect('/index.html')
            return render(request, 'login.html')
    
    
    
    
    
    2.-------dispatch方法上
    
    class LoginView(View):
        @method_decorator(test)
        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 == 'tom' and pwd == "123":
                # 生成随机字符串
                # 写浏览器cookie: session_id: 随机字符串
                # 写到服务端session:
                # {
                #     "随机字符串": {'user_info':'tom}
                # }
                request.session['user_info'] = "tom"
                return redirect('/index.html')
            return render(request, 'login.html')
    
    
    
    
    3.----------  类上
    
    
    @method_decorator(test, 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 == 'tom' and pwd == "123":
                # 生成随机字符串
                # 写浏览器cookie: session_id: 随机字符串
                # 写到服务端session:
                # {
                #     "随机字符串": {'user_info':'tom}
                # }
                request.session['user_info'] = "tom"
                return redirect('/index.html')
            return render(request, 'login.html')
    
    
    
    
    4.--------特殊: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 == 'tom' and pwd == "123":
                # 生成随机字符串
                # 写浏览器cookie: session_id: 随机字符串
                # 写到服务端session:
                # {
                #     "随机字符串": {'user_info':'tom}
                # }
                request.session['user_info'] = "tom"
                return redirect('/index.html')
            return render(request, 'login.html')
    View Code

    II.xss攻击
            - 慎用 safe和mark_safe
            - 非要用,一定要过滤关键字

    1. urls.py

    from app01 import views
    
    urlpatterns = [
        #url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),
        url(r'^comment/', views.comment),
        url(r'^test/',views.test),
    ]
    View Code

    2. views.py

    from django.shortcuts import render
    
    
    msg = []
    
    # def comment(request):       #先
    #     if request.method == 'GET':
    #         return render(request,'comment.html')
    #     else:
    #         v = request.POST.get('content')
    #         msg.append(v)
    #         return render(request,'comment.html')
    
    def comment(request):      #
        if request.method == 'GET':
            return render(request,'comment.html')
        else:
            v = request.POST.get('content')
            if 'script' in v:
                return render(request,'comment.html',{'error':'小比崽子'})
    
            else:
                msg.append(v)
                return render(request,'comment.html')
    
    
    
    def index(request):
        return render(request,'index.html',{'msg':msg})
    
    
    
    def test(request):
        from django.utils.safestring import mark_safe
    
        temp = "<a href='http://www.baidu.com'>百度</a>"
        newtemp = mark_safe(temp)
        return render(request,'test.html',{'temp':newtemp})
    View Code

    3. HTML.py

    1.index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
     <h1>评论</h1>
        {% for item in msg %}
            <div>{{ item | safe}}</div>
        {% endfor %}
    
    </body>
    </html>
    
    
    
    2.comment.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <form method="post" action="/comment/">
            <input type="text" name="content"/>
            <input type="submit" value="提交"/>{{ error }}
            
        </form>
    
    </body>
    </html>
    
    
    3.test.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        {{ temp }}
    
    </body>
    </html>
    View Code
  • 相关阅读:
    JS中的钩子(hook)机制与实现
    Java 之 注解的定义
    Java 网络编程案例:使用 MulticastSocket 实现多点广播
    Java 基于 UDP 协议的网络编程
    Java 网络编程案例四:多个客户端群聊
    Java 网络编程案例三:多个客户端上传文件
    Java 网络编程案例二:多台客户端与服务器之间的多次通信
    Java 网络编程案例一:一台客户端与服务器单次通信
    Java 之 网络常用API
    Java 之 网络编程基础知识
  • 原文地址:https://www.cnblogs.com/zhaochangbo/p/7086856.html
Copyright © 2011-2022 走看看