django开发中的问题

时间问题

django存储到数据库的时间比本地时间小8个小时

Django1.4版本之前,对时区毫无概概念,对时间的存取、展示不做任何处理,数据库里存储的通常是本地时间,当然都是naive time。

Django在1.4版本之后存储如果设置了USE_TZ=True,则存储到数据库中的时间永远是UTC时间。
这时如果settings里面设置了USE_TZ=True与TIME_ZONE = ‘UTC’,用datetime.datetime.now()获取的时间django会把这个时间当成UTC时间存储到数据库中去。
如果修改设置为USE_TZ=True与TIME_ZONE = ‘Asia/Shanghai’,用datetime.datetime.now()获取的时间由于不带时区,django会把这个时间当成Asia/Shanghai时间,即东八区时间,然后django会把这个时间转成带时区UTC时间存储到数据库中去,而读的时候直接按UTC时间读出来,这就是存储到数据库中的时间比本地时间会小8个小时的原因。

数据库

数据库迁移
进行数据库迁移时,出现了Unable to create the django_migrations table (%s)报错,通过查询,发现是django版本与mysql版本不对应,在原本的ubuntn的mysql版本较高,无异常,而debian9的版本不行,解决方法是降低了django版本或者提高mysql版本,我是通过降低django版本解决了问题。

ORM的Q查询
涉及到多个查询条件,且用到逻辑关系时,可以用Q对象进行组合,可用逻辑或,逻辑与,逻辑非来组成想要的过滤条件。
在这里插入图片描述

ORM时间存储问题

在model层设置auto_now时间戳的问题,django框架的modle层在修改数据的时候,如果用filter过滤的数据,然后用update去修改,调用的是sql,不是model层,时间不会自动更新,用get获取数据后,save保存才是通过model层,才会使得时间更新。

ORM主键问题

在表设计中,设置某个字段为主键时,django model层用get将数据查出来后,修改后用save()进行保存并不能真的修改,而是生成新的一条数据,如果要修改原数据的话,需要用filter,然后update()进行修改。

RSA

在用RSA的时候,需要引进相关的包。
Python开发中,通常 pip install crypto 对应的包就下载了,但如果你在venv虚拟环境中发现site-package发现下载的是crypto,第一个字母是c小写的,就会出现问题,需要把c手动改成大写C,就是Crypto,如果Crypto中没有对应的函数,就要抛弃了,可以使用pycrypto,但是这个库好几年没更新了,这时可以用pycryptodome。
其实crypto,pycrypto和pycryptodome三个是一样的,但是pycryptodome是延申版本。
如果下载了相关的包,引用导入了,还是报错了,报了没有相关模块的话,就要把虚拟环境删除,重新部署虚拟环境和下载依赖。

Token

设计token时,引用了jwt包,用的时候,如果报错无encode()属性,大概率时由于PyJWT和JWT同时存在的原因,会使得导入对应模块时出现混乱,这时把两个都卸载了,pip3 uninstall jwt,pip3 uninstall PyJWT,然后重新下载PyJWT就可以用了。

水印

加上水印的过程中,需要用能够支持水印文字的字体样式,一开始用的系统自带字体样式,不能支持中文,会导致水印的中文文字出现乱码,通过找到对应能够支持中文字体样式,然后引进到debian中,就可以实现中文的水印文字了。

from PIL import Image, ImageDraw, ImageFont

def add_text_to_image(image, text):
    # 字体样式,大小
    font = ImageFont.truetype('C:\Windows\Fonts\Arial.ttf', 50)

    # 添加背景
    new_img = Image.new('RGBA', (image.size[0] * 3, image.size[1] * 3), (0, 0, 0, 0))
    new_img.paste(image, image.size)

    # 添加水印
    font_len = len(text)
    rgba_image = new_img.convert('RGBA')
    text_overlay = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))
    image_draw = ImageDraw.Draw(text_overlay)

    for i in range(0, rgba_image.size[0], font_len*40+100):
        for j in range(0, rgba_image.size[1], 200):
            image_draw.text((i, j), text, font=font, fill=(0, 0, 0, 50))
    text_overlay = text_overlay.rotate(-45)
    image_with_text = Image.alpha_composite(rgba_image, text_overlay)

    # 裁切图片
    image_with_text = image_with_text.crop((image.size[0], image.size[1], image.size[0] * 2, image.size[1] * 2))
    return image_with_text

正则表达匹配

正则表达式描述一种字符串匹配的模式,可以用来检查指定的格式。

# username英文判断,中间可带空格 . 
reg = '^([A-Za-z]+[ ])*[A-Za-z]+$'
if re.match(reg, s):
    print(True)
else:
    print(False)

# username中文判断,中文名字中间可带 . 
reg = '^([\\u4e00-\\u9fa5]+[.])*[\\u4e00-\\u9fa5]+$'
if re.match(reg, s):
    print(True)
else:
    print(False)

# marname英文判断,可带数字
reg = '^[A-Za-z]+[0-9]*$'
if re.match(reg, s):
    print(True)
else:
    print(False)

# marname中文判断,可带数字
reg = '^[\\u4e00-\\u9fa5]+[0-9]*$'
if re.match(reg, s):
    print(True)
else:
    print(False)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值