form触发2次 layui_python基础复习-2

这篇博客主要复习了Django中前后端数据传输的三种格式,特别是JSON及如何处理POST请求中的字典。强调了在使用form时,由于submit按钮可能导致请求被触发两次的问题,以及QueryDict的特性。还探讨了Python的魔法方法、cookie、session和token的使用,以及异常处理和pymysql的运用。
摘要由CSDN通过智能技术生成

一.作业

前后端传输数据的3种格式,传json格式,原生的django不能从post请求中取出字典.用中间件或者装饰器不管传json还是其他格式,request对象中取出字典.

中间件:

 url(r'ajax_qq/',views.ajax_qq)

<form action="">
    用户名:<input type="text" name="name" id="d2">
    密码:<input type="text" name="pwd" id="d2">
    <input type="button" id="d1" value="点击">
    <input type="submit" value="提交1">
</form>
<body>
<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            contentType:'application/json',
            data:JSON.stringify({'name':$('d2').val()},{'pwd':$('d3').val()})
            success:function (data) {
                console.log(data)
            }
        })
        
    })
</script>

</body>



自定义中间件:
from django.middleware.common import  MiddlewareMixin

import json
class Zidingyi(MiddlewareMixin):
    def process_request(self, request):
        try:
            request.data=json.load(request.body)
        except Exception as e:
            request.data=request.POST


view.py(粗糙版)
def ajax_qq(request):
    if request.method=='GET':
        return render(request,'ajax_qq.html')
    else:
        print(request.POST)
        return HttpResponse('ok')


细化版:
def index(request):
    if request.method=='GET':
        request.session['name']='lqz'
        print(type(request.session))
        from django.contrib.sessions.backends.db import SessionStore
        return render(request,'index.html')
    else:
        from django.http.request import QueryDict
        print(request.POST)
        print(type(request.POST))
        print('body的内容:',request.body)
        print(request.data.get('name'))
        return HttpResponse('ok')

注意:

1 form表达和ajax提交的重复,form表单中input的submit类型和button按钮都会触发两次(有ajax的情况),input的button类型

2 f rom django.http.request import QueryDict

本质就是一个字典,比字典强大。不能修改值,一改就报错

3 CommonMiddleware中间件控制了是否重定向到带/的地址

二. python中的魔法方法.

__init__: 类实例化时触发
__str__ : 打印对象时触发
__call__: 对象()时触发,注意类也是对象,所以类() ,类实例化过程中会调用元类的__call__
__new__: 在类实例化会触发,他比__init__会早.
__del__ :对象回收货删除的时候会触发
__setattr__,__getattr__: 在 .拦截时,当对象.属性时.赋值会调用..setattr如果取值会调用getattr.
__getitem__.__setitem__: 在[]拦截时调用
__enter__和__exit__;上下文管理

setattr,getattr,setitem,getitem演示

 class Person:
     def __init__(self,name):
        self.name=name
     def __setitem__(self, key, value):
         setattr(self,key,value)  #反射
     def __getitem__(self, item):
         return getattr(self,item) # 反射取值

 p=Person('lqz')
 p.name='ppp'
 p['name']=10 # 如何变行 重写__setitem__魔法方法
 print(p.name)
 print(p['name'])




class Mydic(dict):
    def __setattr__(self, key, value):
        print("对象加点赋值,会触发我")
        self[key]=value
    def __getattr__(self, item):
        print("对象加点取值,会触发我")
        return self[item] # 不要加引号

mydic=Mydic(name='lqz',age=18)
# print(mydic['name'])
print(mydic.name)
# mydic.name=99
# print(mydic.name)

with 上下文管理器

class Person:
    def __enter__(self):
        print("我在with管理的时候,会触发")
        print('进入with语句块时执行此方法,此方法如果有返回值会赋值给as声明的变量')
        return 'oo'

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出with代码块时执行此方法')
        print('1', exc_type)
        print('2', exc_val)
        print('3', exc_tb)


with Person() as p:   # 这句话执行,会触发类的__enter__
    print(p)

eq:

class A:
    def __init__(self,x,y):
        self.x = x
        self.y = y

    # def __eq__(self,obj):
    #     # 打印出比较的第二个对象的x值
    #     print(obj.x)
    #     if self.x +self.y == obj.x+obj.y:
    #         return True
    #     else:
    #         return False

a=A(1,2)
b=A(99,3)
print(a=='ddd')   # 当执行==s时,会触发__eq__的执行,并且把b传进去,就是object
# ==后只要是对象,就可以传进去,就是object

三/ cookie,session,token

# HTTP协议:无状态,无连接,基于请求响应,基于tcp/ip,应用层协议

# mysql:c/s架构:底层基于socket,自己封装的协议,mysql的客户端:navcate(c++图形化界面,实现了请求和响应协议),pymysql(用python语言实现了请求和响应协议)
# redis:c/s架构:底层基于socket,自己封装的协议
# docker:c/s架构,基于http协议,使用restfull规范
# elasticsearch:c/s架构,基于http协议,使用restfull规范

# cookie:是存在于浏览器的键值对,向服务端发送请求,携带它过去(不安全)
# session:存在于服务端的键值对(放在哪?内存中,文件,mysql,redis)
#  缺陷:如果用户量很大,存储需要耗费服务器资源
# token:就是个字符串(既安全,又存个人信息),加密字符串,会有个人信息

# token现在应用非常广泛,契合了前后端分离
# JWT:json web token

参考:

彻底理解cookie,session,token - 刘清政 - 博客园​www.cnblogs.com
6dd487624f6f1d9b2f50d9c871ed6c08.png

django中的session底层原理

在中间件中,请求走的时候,process_response,取出request.session的modify属性,判断是否是true,如果是true,表示在视图函数中修改过session,数据库同步修改,如果是false,就不修改,返回给前端sessionid:随机字符串

请求来了,通过sessionid,取出随机字符串--》去数据库中查--》把表的数据转成字典,赋值给request.session,后面视图函数中就可以操作它了

四. 异常处理

try:
except   :
finally:
else:  什么时候执行


try:
    print("xxx")
    # print(1/0)
except Exception as e:
    print(e)
else:  # 基本上不会用到
    print("正常执行,没有出异常,会走")
finally:
    print("我是finally")   # 用于会走,无论是否有异常

参考博客:密码(xiaoyuanqujing @666)

10-01 异常处理 - 小猿取经 - 博客园​www.cnblogs.com
23d7c0a6bb2927258b46e74e6e5b24b5.png

五. pymysql的使用

import pymysql

#连接数据库
conn=pymysql.connect(host='101.133.225.166', user='root', password="123456",database='test', port=3306) #
# 获取游标
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 查出来数据是字典格式
# 操作 定义一个sql
# sql='select id,name from book'
# cursor.execute(sql)
# ret=cursor.fetchall()
# print(ret)

# 插入
# sql='insert into book(id,name) values (%s,%s)'
# cursor.execute(sql,[3,'lqz'])
# conn.commit()

# 删除
# sql='delete from book where name=%s'
# cursor.execute(sql,['lqz'])
# conn.commit()

# 更新
# sql='update book set name=%s where id=%s'
# cursor.execute(sql,['xxx',1])
# conn.commit()

参考博客:

13-01 初始数据库 - 小猿取经 - 博客园​www.cnblogs.com
5eb5e9aa918f6d382879d343046afa58.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值