• django框架下ajax获取cookie和session的方法以及简单的vue


    Django的配置:

      pycharm中创建django工程之后注释掉MIDDLEWARE项中的'django.middleware.csrf.CsrfViewMiddleware'。此处作用是为了能够让js获取到cookie值

      同时为了使用mysql,我们在setting中修改DATABASES中的'default'项为

            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db_test_shop1',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'USER':'root',
            'PASSWORD':'1415926',    

      参数一目了然无需多讲

      在django的控制台下执行python manage.py startapp 你的app项目名来新建一个app项目,此后的工程都在这里写。然后在setting中的INSTALLED_APPS项中注册app,添加'django.apps.你的app的名字Config'

      同时在setting中添加以下代码来寻找static路径和模板代码路径

    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,'static')
    ]

      开启调试功能的代码为在setting中添加

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }

      为了使用现成的数据库中的数据,我们可以通过在控制台中执行python manage.py inspectdb来获取代码,复制粘贴到app中的model文件中

      html模板中若为了使用django的模板语言需要在开头加上{% load static %}

    Django中后端的编写

      以上准备工作完成之后在app项目文件夹里的urls里如下配置

    from django.contrib import admin
    from django.urls import path
    from tableapp.views import *
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('',indexRender_CookieAndSession),
        path('test',testAjax_CookieAndSession),
        path('goTestRender',goTestRender),
        path('getSession',getSession),
    ]

      path的第一个参数为前端的请求地址,第二个参数为调用的函数

      然后就在view文件里编写函数即可

    from django.shortcuts import render
    from tableapp.models import *
    from django.views.static import HttpResponse
    from django.http import JsonResponse
    from tableapp.models import *
    import json
    from django.views.decorators.csrf import csrf_exempt
    # Create your views here.
    
    def getSession(request):
        return JsonResponse({"result":request.session.get(json.loads(request.body).get("key"))})
    
    def indexRender_CookieAndSession(request):
        #测试session
        request.session["t1_session"]="session1"
        #删除session: del request.session["t1_session"]
        #网页转发到index.html
        rsp = render(request,"index.html")
        #测试cookie设置
        rsp.set_cookie("t1_cookie",233)
        #删除cookie: rsp.delete_cookie("t1_cookie")
        return rsp
    
    def goTestRender(request):
        return render(request,"test.html")
    
    # @csrf_exempt
    def testAjax_CookieAndSession(request):
        #request是json格式传过来的参数,需要转换成字典对象
        params = json.loads(request.body)
        print("testParamInteger:",params["testParamInteger"])
        print("testParamString:", params["testParamString"])
        # 测试session
        request.session["t2_session"] = "session2"
    
        #orm简单的两表查询
        #   用模型类.objects来进行数据库操作,filter等同于where操作,values_list将查询结果转换成结果元祖,而非values的字典对组成的json对象形式。可以通过切片进行选取操作,[开始位置:结束位置:隔几个取一个](以上参数和切片一样可以任意省略)
        data = TGoods.objects.filter(goods_status=1).values_list("goods_id","goods_name","goods_price","type__t_g_type__type_name")[0:10:1]
        title = ("商品ID","商品名","商品价格","商品类别","操作")
        result = {"result":1,"data":data,"title":title}
        #这里可以替换成 return JsonResponse(result)
        resp = HttpResponse(json.dumps(result),content_type="application/json")
        resp.set_cookie("t2_cookie","cookie2")
        return resp

      然后提前放上测试用的各种代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        {% load static %}
        <meta charset="UTF-8">
        <script type="text/javascript" src="{% static 'js/jquery-3.2.1.min.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/jquery-cookie.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/my-session.js' %}"></script>
        <title>Title</title>
    </head>
    <body>
        <a href="goTestRender">跳转到test页面</a>
    </body>
    <script type="text/javascript">
        console.log("render cookie:",$.cookie("t1_cookie"))
        console.log("render session:",getSession("t1_session"))
    </script>
    </html>
    index.html
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
          {% load static %}
        <title>test table</title>
    {#    <link rel="stylesheet" href="style.css">#}
        <!-- Delete ".min" for console warnings in development -->
        </head>
      <body>
    
    
    <!-- 取消这个范围内的django解析,从而解决django与vue语法冲突问题 -->
    {% verbatim %}
      <script type="text/x-template" id="my_test_template">
      <table>
          <thead>
            <tr>
                <td v-for="t in title">
                    {{ t }}
                </td>
            </tr>
          </thead>
          <tbody>
                <tr v-for="row in testData">
                    <td v-for="d in row">{{ d }}</td>
                </tr>
          </tbody>
      </table>
    </script>
    {% endverbatim %}
        <!-- Vue.compent里的变量名=实例化时对应的变量名 -->
        <!-- Vue.compent里的变量名如果是驼峰命名两个单词的话需要用中划线分割 -->
        <my-test-table
            :title="myTitle"
            :test-data="myData"
        ></my-test-table>
    
      </body>
    
    
        <script type="text/javascript" src="{% static 'js/jquery-3.2.1.min.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/jquery-cookie.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/my-session.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/vue.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/table.js' %}"></script>
    </html>
    test.html
    function getSession(key) {
        result = undefined
        $.ajax({
            url:"getSession",
            type:"post",
            dataType:"json",
            data:JSON.stringify({key:key}),
            async:false,
            success:function (data) {
                result = data.result
            }
        })
        return result
    }
    my-session.js
    Vue.component('my-test-table',{
        template:"#my_test_template",
        props:{
            title:Array,
            testData:Array,
        }
    })
    
    function getData()
    {
        $.ajax({
            url:"test",
            type:"post",
            dataType:"json",
            data:JSON.stringify({
                testParamInteger:1,
                testParamString:"测试参数"
            }),
            success:function (data) {
                console.log(data)
                //  传过来的参数自动被解析成对象了,无需转换
                var myVue = new Vue({
                    el:"my-test-table",
                    data:{
                        myTitle:data.title,
                        myData:data.data
                    }
                })
    
                //  测试cookie和session
                console.log("Ajax Cookie:"+$.cookie("t2_cookie"))
                console.log("Ajax Session:"+getSession("t2_session"))
            }
        })
    }
    
    $(function () {
        getData()
    })
    table.js

      测试结果

    难点解释:

      前端的my-session.js中的async:flase是为了取消异步,能让返回值在获取到结果之后再返回

      cookie获取方法为引入jquery-cookie.js文件,调用$.cookie即可

      session的获取方法为my-session中再次请求

      此外其他点都在注释里了

  • 相关阅读:
    Bzoj 2748: [HAOI2012]音量调节 动态规划
    Bzoj 1222: [HNOI2001]产品加工 动态规划
    Bzoj 2763: [JLOI2011]飞行路线 拆点,分层图,最短路,SPFA
    Bzoj 2718: [Violet 4]毕业旅行 && Bzoj 1143: [CTSC2008]祭祀river 传递闭包,二分图匹配,匈牙利,bitset
    Bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛 传递闭包,bitset
    Hdu 5036-Explosion 传递闭包,bitset,期望/概率
    Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset
    Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学
    最小公倍数(LCM)
    最大公约数(GCD)
  • 原文地址:https://www.cnblogs.com/dofstar/p/11711502.html
Copyright © 2020-2023  润新知