Django
文章平均质量分 52
冰冷的希望
坚持记录,相互帮助,一起进步
展开
-
【Django】在Linux上部署Django(nginx+uwsgi)
关于在Linux上使用uwsgi部署Django的项目的过程并不难,主要是配置文件的写法,尤其是nginx的配置文件,本文在Ubuntu20.04上通过uwsgi和nginx部署Django项目。一般来说,如果是Django项目与nginx处于同一台服务器,sock文件的方式会比IP端口更高效一点,但是使用sock文件的时候注意一下是否有读写权限。我们要修改nginx的配置文件,如果你希望监听80端口,你可以直接修改nginx的默认配置文件,一般是。安装完之后,它会自动运行nginx,访问一下本机的IP(原创 2023-07-04 17:12:02 · 2931 阅读 · 0 评论 -
【django】django-redis的使用方法
Django-redis默认的连接的类是DefaultClient,如果你有更高的定制需求,可以新建一个自己的类,继承ConnectionPool有了这个类之后还需要在Django的配置文件里指定它。原创 2022-11-02 18:11:55 · 7016 阅读 · 0 评论 -
【Django】自定义序列化格式,Django返回JSON序列化datetime格式问题
我们使用Django返回JSON的时候,例如使用JsonResponse,它会把时间处理成以下这样2021-10-28T23:36:17.119,中间带有字母T,并且可能会有小数点,但更多时候我们需要的是一个符合我们需求的时间格式,例如2021-10-28 23:36:17{ "count": 2, "code": 0, "data": [ { "id": 2, "is_active": true,原创 2021-10-28 23:53:25 · 874 阅读 · 0 评论 -
【python】多级菜单列表权限控制
在开发过程中经常遇到多级菜单的情况,比如说导航栏、分类栏等等,甚至可以是无限级菜单。下面是角色的权限控制,根据数据库控制是否可以查看某个菜单1.数据库相关表CREATE TABLE `tb_menus` ( `menu_id` int(11) NOT NULL AUTO_INCREMENT, `menu_name` varchar(200) NOT NULL, `menu_level` int(11) NOT NULL, `superior_menu_id` int(11) NOT N原创 2021-09-02 11:22:35 · 507 阅读 · 0 评论 -
【Django】Django连接不同数据库执行原生sql语句
Django有自带的ORM框架,关于ORM的使用方法可以参考之前的文章【Django】ORM模型类对数据库的增删改查、QuerySet查询集但有时候我们需要执行原生的sql语句,Django也提供了相关的数据库连接3.不同数据库如果你的项目有多个数据库,可以通过alias指定要连接哪个数据库。alias就是配置文件里DATABASES配置项的key。例如我这里连接wallet3这个库...原创 2021-07-14 17:40:57 · 721 阅读 · 0 评论 -
【Django】OperationalError(2006, ‘MySQL server has gone away‘)、django.db.utils.InterfaceError: (0, ‘‘)
这个错误,它也是因为MySQL等待时间过长而自动断开连接了,所以可以再次使用ORM之前先关闭之前的全部连接。由于没有给出具体报错信息,所以也不确定是否超过了最大连接数,可以试一下修改MySQL的最大连接数。注意上面的方法只是临时修改,重启后失效,若要永久修改,需修改配置文件。注意上面的方法只是临时修改,重启后失效,若要永久修改,需修改配置文件。,加上如下配置项,之后记得保存和重启MySQL才能生效。,这个报错是指MySQL断开了,具体原因得实际分析。永久修改,即修改配置文件,例如。MySQL两个相关设置。原创 2021-07-14 16:30:52 · 1857 阅读 · 0 评论 -
【Django】使用谷歌身份验证Google authenticator
1.说明为了安全,可以使用Google authenticator作为二次验证的条件,使用起来很简单,只需要使用Google authenticator APP扫描一下二维码即可得到六位数验证码,验证码每30秒变一次2.代码模型类GoogleAuthclass GoogleAuth(models.Model): user_id = models.IntegerField(null=False, verbose_name="用户ID") user_name = models.CharF原创 2021-07-09 13:19:55 · 1355 阅读 · 0 评论 -
【Django】生成二维码
qrcode是一个生成二维码的好库,我们只要把数据传给QRCode()就可以轻松创建一个二维码,当然也可以设置二维码的容错率、样式等import pyotpimport tracebackfrom qrcode import QRCode, constantsdef get_google_qrcode(token, username): # dirpath = "./img" data = pyotp.totp.TOTP(token).provisioning_uri(userna原创 2021-07-09 13:04:23 · 1005 阅读 · 0 评论 -
【Django】Django+Ajax下载文件(使用FileResponse)
1.说明使用Django下载文件的方式有多种,这里使用的是FileResponse对象返回文件即可# 视图函数@csrf_exemptdef getFinanceBalanceFile(request): ... filename = "{}_余额.xlsx".format(time.strftime("%Y-%m-%d", time.localtime())) file = open("xxxx", 'rb') response = FileResponse(fil原创 2021-06-09 18:20:05 · 2472 阅读 · 0 评论 -
【Django】Django项目会加载两次(代码初始化执行两次)
背景今天开发的时候遇到了一个问题,在项目的__init__.py文件初始化一个多进程的定时任务,然后发现它竟然启动了两个进程(进程ID不一样),起初以为是不能在初始化文件启动多进程,把它移动到manage.py文件还是出现了一样的情况。后来经过研究发现,在debug模式(开发模式)下Django会开启两个线程,另一个用来监听代码变化(比如说Ctrl+S会自动重启)解决如果不想让它启动执行两次,可以在启动命令加上“–noreload”python manage.py runserver 8000 --原创 2021-06-02 17:07:00 · 3181 阅读 · 2 评论 -
【Django】单元测试TestCase、Client的用法
1.单元测试单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作,是测试最小独立的单元模块如果有需要,可以给项目进行单元测试,主要目的有消灭低级错误、减少和快速定位BUG、提高代码质量2.django单元测试我们在创建好一个APP的时候,它会在自动在APP目录创建一个tests.py文件,这个就是拿来做单元测试的apps/users/tests.pyfrom django.test import TestCaseclass MyTestCase(TestCase):原创 2020-10-19 20:54:16 · 2998 阅读 · 0 评论 -
【Django】ManyToManyField多对多字段的处理
我们在使用DRF完成序列化的时候可能会遇到ManyToMany字段,这是多对多的字段。比如说下面的这个模型类class Article(models.Model): ... collected_users = models.ManyToManyField(User, symmetrical=False, related_name='collected_articles') # 被哪些用户收藏 class Meta: db_table = "tb_article"原创 2020-10-16 11:32:08 · 2933 阅读 · 3 评论 -
【Django】CKeditor富文本编辑器上传图片到FastDFS存储
因为在存储数据的时候可能会遇到存储信息并非纯文本的情况,比如说带有HTML语法,带有图片URL等,即富文本格式,也许我们需要使用富文本字段来存储具备丰富格式的文本1.安装CKeditor与配置pip install django-ckeditor在配置文件 settings.py 添加应用NSTALLED_APPS = [ ... 'ckeditor', # 富文本编辑器 'ckeditor_uploader', # 富文本编辑器上传图片模块 ...]...原创 2020-10-15 10:31:05 · 535 阅读 · 0 评论 -
【Linux】nginx代理与反向代理、负载平衡、日志(使用uwsgi部署Django)
1.代理与反向代理正向代理或反向代理是取决于是接收服务还是提供服务。比如说,一个人想要上网,可以借助浏览器实现与互联网交互,人与浏览器是一起的,这个是正向代理;一个人想要点餐,跟服务员说,服务员再跟厨师说,服务员是跟厨师一起的,这个是反向代理我们使用nginx一般做的是反向代理,即请求的服务经过nginx,再由nginx进行分发2 proxy_passproxy_pass 指令设置代理服务器的地址和被映射的URI,地址可以是主机名或IP加端口号location /html/ { proxy_p原创 2020-10-08 17:52:07 · 400 阅读 · 0 评论 -
【Django】使用FastDFS docker镜像存储图片和读取图片
1.FastDFSFastDFS是一个用C语言写的开源的轻量级分布式文件系统功能包括文件存储、文件访问(文件上传、文件下载)、文件同步等,解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如相册网站、视频网站FastDFS架构 包括Client、Tracker server和Storage server我们在Django项目存储和读取图片可以通过FastDFS实现,但这里使用docker运行该镜像2.docker运行FastDFS2.1 安装FastDFS先在系统上安装好Doc原创 2020-10-07 12:20:52 · 950 阅读 · 0 评论 -
【Django】transaction事务的使用、乐观锁与悲观锁
1.事务的四大特性(1)原子性:事务中的所有操作是一个不可分割的整体(2)一致性:数据变更要保持一致(3)隔离性:多个事务对数据的修改操作,对彼此间的可见性(4)持久性,提交后保存到硬盘永久存储2.事务的隔离级别事务有隔离性,根据隔离级别不同,事务彼此间的可见性不同从高到低依次为串行事务(Serializable)、可重复读(Repeatable-Read)、读已提交(Read-Committed)、读未提交(Read-Uncommitted)2.1 四种级别对比2.2 修改My原创 2020-09-28 19:10:04 · 1511 阅读 · 0 评论 -
【Django】DRF自定义异常处理
1.默认的异常处理DRF有自己的异常捕获机制,可以捕获到APIException、Http404、PermissionDenied等异常处理函数位于rest_framework.views.exception_handler,下面是它的源码def exception_handler(exc, context): ... if isinstance(exc, Http404): exc = exceptions.NotFound() elif isinstance(ex原创 2020-09-24 14:11:26 · 1945 阅读 · 0 评论 -
【Django】DRF过滤、排序、分页的简单使用
1.过滤我们可以安装django-filter来控制过滤操作,只要安装好之后再配置一下即可安装pip install django-filtersettings.pyINSTALLED_APP = [ .... 'django_filters',]# REST_FRAMEWORK配置项对"drf接口"进行全局配置# 全局配置针对所有的drf视图(接口)REST_FRAMEWORK = { # ...... # 过滤后端,针对所有资源视图的self.list原创 2020-09-24 13:48:51 · 986 阅读 · 3 评论 -
【Django】DRF身份认证、流量控制
这里所说的身份认证和流量控制都是DRF中的APIView提供的功能APIView会在进行dispatch()分发前,对请求进行身份认证、权限检查、流量控制1.身份认证身份认证可以配置全局(在Django的配置文件)或局部(在视图类),当配置了局部,全局会失效1.1 全局配置在settings.py添加一个REST_FRAMEWORK字典REST_FRAMEWORK = { # 默认配置,即针对所有的drf视图 'DEFAULT_AUTHENTICATION_CLASS':(原创 2020-09-24 10:52:15 · 509 阅读 · 0 评论 -
【Django】DRF的ViewSet视图集、action装饰器、Routers路由
1.重要的视图集视图集说明ViewSetMixin重写self.as_view()函数,传入字典指定请求方式映射的视图函数ViewSet继承ViewSetMixin和APIView,提供了身份认证、权限校验、流量管理等ModelViewSet继承五大拓展类和GenericAPIView,提供增删改查接口 self.list()、 self.create()、 self.retrieve()、 self.update()、 self.partial_update()、原创 2020-09-23 18:39:32 · 4001 阅读 · 0 评论 -
【Django】DRF(rest_framework)的视图相关
1.两个基类1.1 APIView(1)APIView继承于Django的View,是REST framework提供的所有视图的基类,request参数不是Django的HttpRequeset,而是在此基础上进行了拓展,request.data:即Django的request.POST和 request.FILESrequest.query_params:即Django的request.GETResponse(需另外导入):任何APIException异常都会被捕获到1.2 GenericA原创 2020-09-23 16:49:05 · 389 阅读 · 0 评论 -
【Django】DRF的模型类序列化器
比起自定义的序列化器,使用DRF已经写好的模型类序列化器可以大大简化代码,它主要有两个表现(1)、根据指定的规则,自动映射字段参与序列化/反序列化(2)、重写了create()和update()方法实现模型类对象的新建和更新逻辑from rest_framework import serializers# serializers.ModelSerializer: 模型类序列化器基类from .models import *def check_btitle(value): if "dja原创 2020-09-20 21:53:41 · 341 阅读 · 0 评论 -
【Django】DRF自定义序列化器、序列化与反序列化
使用Django前后端分离开发的情况下,我们经常需要把处理后的数据按照一定的格式(比如说json)返回,或者把前端传过来的数据进行处理才能进行数据库的CURD。而DRF(Django REST Framework)就可以帮忙我解决这个问题,即序列化和反序列化1.安装DRF使用pip安装pip install djangorestframework配置应用INSTALLED_APPS = [ ... 'rest_framework',]2.定义Serializer我们新建一原创 2020-09-20 21:39:07 · 3795 阅读 · 1 评论 -
【Django】MySQL读写分离(主从分离)
1.主从分离为了提高MySQL的性能,一般会选择使用多个MySQL同时工作,分为主服务器和从服务器,一台主服务器对应多台从服务器主从同步是基于二进制日志机制的,主服务器将数据变动的情况写进二进制日志,从服务器读取该日志并且执行该日志文件使数据保持一致优点提高读写性能数据写入和读取是在不同的服务器上进行的,而且可以通过增加从服务器来提高数据库的读取性能提高数据安全因为数据已复制到从服务器,可以在从服务器上备份而不破坏主服务器相应数据2.配置步骤2.1 下载MySQL的docker镜像原创 2020-09-19 13:31:04 · 750 阅读 · 3 评论 -
【Django】自定义认证后端ModelBackend完成多手机号邮箱登录
Django默认的认证后端是判断用户的username和password这两个字段是否通过校验,但实际上,我们可能会有更多的登录需求,比如说,既可以通过用户名,也可以通过手机号或邮箱等登录,这时候我们可以重写authenticate()方法实现1.自定义认证后端我们新建一个py文件,里面写一个类继承ModelBackend,并且重写authenticate()方法from django.contrib.auth.backends import ModelBackendimport refrom .原创 2020-09-12 08:35:13 · 1417 阅读 · 0 评论 -
【Django】使用pickle、base64编码解码数据
如果返回给前端的数据如果很重要,我们可以使用itsdangerous等进行加密传输。但并不是很敏感,我们可以使用简单的编码不让它直接显示明文,比如说用pickle序列化成字节,再使用base64编码成一个可视化的字符串1.编码和解码pickle编码解码只需要调用dumps()和loads()方法即可,base64编码解码只需要调用b64encode()和b64decode()即可需要注意的是,编码得到的数据是字节类型的import pickle,base64data = {"name":"pan原创 2020-09-11 20:01:55 · 1044 阅读 · 0 评论 -
【Django】paginator分页器的简单使用
有时候前端会按照分页的方式查询数据,例如50条数据,每页展示10条,Django已经给我们提供了分页器,我们只需要调用即可1.导入模块from django.core.paginator import Paginator, EmptyPage2.创建Paginator对象skus = SKU.objects.filter(category_id=category_id,is_launched=True).order_by(sort)paginator = Paginator(skus, page原创 2020-09-11 19:17:29 · 317 阅读 · 0 评论 -
【Django】自定义存储后端返回完整图片的URL链接
我们在Django存储图片的时候,并不是直接存储图片,而是存储图片的唯一标识,再通过标识去获取图片,例如下面的模型类有一个image字段,字段类型是ImageFieldclass SKUImage(BaseModel): sku = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku') image = models.ImageField(verbose_name='图片') # 存储图片 cla原创 2020-09-11 18:10:46 · 3365 阅读 · 0 评论 -
【Django】导包路径问题
补充记录一个关于导包路径的问题,在Django的配置文件里提供了一个BASE_DIR的路径用于文件定位,我们把它打印出来settings.pyimport osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))print(BASE_DIR)发现它是内层目录(项目里的主应用)它是根据os.path.abspath(file)获取配置文件的绝对路径,然后再通过os.path.dirname()两次取上级目录原创 2020-09-11 17:24:50 · 1295 阅读 · 0 评论 -
【Django】页面静态化和crontab定时任务
一个网页会有很多数据是不需要经常变动的,比如说首页,变动频率低而访问量大,我们可以把它静态化,这样就不需要每次有请求都要查询数据库再返回,可以减少服务器压力所谓页面静态化,就是提前渲染出完整的html页面,以静态文件的形式存起来,那么下一次浏览器访问的时候,直接返回该静态文件就可以了我们可以使用Django的模板渲染功能完成页面渲染1.页面静态化我们在Django项目里新建一个py文件,里面写一个渲染首页的方法from django.template import loaderdef gene原创 2020-09-11 14:59:41 · 602 阅读 · 0 评论 -
【Django】使用itsdangerous加密json数据生成token
有时候我们需要把一些信息传给前端,之后前端再传回来,若是遇到敏感信息就会被暴露,所以我们需要把它加密成一个token,待前端传回来的时候再进行解密。我们可以使用itsdangerous这个模块进行加密和解密操作1.安装itsdangerouspip install itsdangerous2.简单使用其实itsdangerous的用法有多种,我们这里只用给JSON加解密的方法,需要用到TimedJSONWebSignatureSerializer类的dumps()和loads()方法from i原创 2020-09-11 14:25:54 · 716 阅读 · 0 评论 -
【Django】模型类一对多外键related_name关键字的使用
1.场景图书馆要整理书籍,一本书里会出现多个人物,现有两个表,一个是book,一个是hero,分别记录书本 信息和人物信息。比如说《神雕侠侣》这本书里有杨过、小龙女、郭襄等人物,这是属于一(book)对多(hero)问题,我们可以把关系存在多的一方,即把外键存在hero表里2.模型类class BookInfo(models.Model): """图书信息:演示一对多,一方""" btitle = models.CharField(max_length=20, verbose_name原创 2020-09-07 10:17:30 · 1579 阅读 · 0 评论 -
【Django】使用captcha生成图形验证码、设置有效期
一般登录界面都会有图形验证码,我们可以使用第三方的模块captcha快速生成图形验证码返回给前端,并且把正确的文本保存到Redis数据库1.captcha首先下载captcha,我已经上传到百度网盘,大家可以下载captcha使用,提取码: mxum下载完之后进行解压,得到一个captcha文件,我们把它复制到项目文件夹里该模块使用很简单,只需要导入captcha.py文件,再调用generate_captcha()方法即可生成一张jpg格式的四位数验证码图片from XXXXXX.captcha原创 2020-09-04 18:05:06 · 2165 阅读 · 0 评论 -
【Django】用户登录与注销、判断用户是否登录
我们可以可以使用Django的认证功能来管理用户的登录与注销1.login()登录login()函数需要request和user这两个参数,它会把user的信息写入到 session,并且把sessionid存到cookie中users.views.py(注册,注册完之后即登录)from django.contrib.auth import login # 导入登录from django import http# 注册,注册完之后即登录class RegisterView(View):原创 2020-09-04 17:06:16 · 2688 阅读 · 0 评论 -
【Django】创建用户,继承AbstractUser自定义用户模型类
1.AbstractUser如果要创建一个用户,需要设置各种字段、组、权限、cookie管理、密码处理等,比较麻烦,所以Django已经为我们创建了一个抽象用户,我们只需要继承它,然后添加自己的字段即可用户基本属性和常用方法属性或方法说明username用户名(必要)password密码(必要)email邮件first_name名字last_name姓氏is_staff是否管理员create()创建一个普通用户create_u原创 2020-09-04 11:14:35 · 2875 阅读 · 0 评论 -
【Django】 Celery 进程执行异步任务(生产者与消费者)
我们在项目中可能会遇到需要多任务执行的情况,例如给用户发送短信验证码、邮件等,但是可能会因为网络问题导致进程阻塞,这时候我们可以开启其他进程。有了 Celery,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了程序员的开发流程celery简单可靠,还可以在多台服务器上运行,单个celery进程每分钟可以处理数以百万计的任务1.安装celery我们进入到虚拟环境中安装celerypip install Celery -i https://pypi.tuna.tsinghua.edu.cn原创 2020-09-03 17:51:35 · 1077 阅读 · 1 评论 -
【Django】配置本地域名、解决前后端跨域问题
由于开发需求,我们可能会需要使用特定域名访问项目,但是当前又不方便直接上线,所以我们可以使用本地域名的方式访问,我们只需要在hosts文件里添加域名和ip即可1.Linux如果使用的是Linux系统,我们打开/etc/hosts文件# 打开hosts文件sudo vim /etc/hosts# 增加ip和域名: 127.0.0.1 www.mysite.site保存之后退出即可2.Windows如果使用的是Windows系统,我们打开C:\Windows\System32\d原创 2020-09-01 11:13:31 · 2787 阅读 · 1 评论 -
【Django】配置MySQL数据库、Redis数据库、调用Redis(封装批量读取)
1.配置MySQL数据库关于在Django中安装MySQL数据库的方法可以参考之前的文章Django数据库改成MySQL、ORM的字段类型和约束安装完之后我们只要在配置文件里(这里是dev.py)修改DATABASES列表即可DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'HOST': '127.0.0.1', # 数据库主机 'PORT': 3原创 2020-09-01 10:51:58 · 1004 阅读 · 0 评论 -
【Django】修改项目的配置文件、模板文件夹路径
1.修改settings配置文件位置我们在创建Django项目的时候,内层(主APP)文件夹里会自动生成一个settings文件用于配置Django项目的相关参数,但是在开发和真正的生产环境可能使用不用的配置,所以我们可以给它创建两个不同的配置,部署产品的时候只要修改之使用哪个配置文件即可1.1 新建配置文件我们在原来的settings文件所在的同级目录下再创建一个settings的文件夹,里面分别再创建两个py文件,然后把原来的settings.py的内容分别复制到新建的两个py文件,再把原来的se原创 2020-09-01 10:37:15 · 2018 阅读 · 2 评论 -
【Django】cookie、session的作用、设置读取以及其他操作
1.cookie因为HTTP协议是无状态的,服务器无法辨别不同的用户,所以在1993年发明了cookie。其实,cookie实际上是一小段存储在用户浏览器中的文本信息cookie大概有以下几个特点是以键值对Key-Value形式进行信息的存储基于域名安全,不同域名的cookie不能相互访问它会自动跟随当前的请求传递到对应域名所在的服务器中1.1 设置cookie在Django,我们可以使用HttpResponse对象的set_cookie()方法设置cookie# 创建响应对象resp原创 2020-08-28 22:03:45 · 434 阅读 · 0 评论