Django
查看历史

相关内容

Django上传图片时ImageField的max_length报错

我使用的版本是Django 4.2,有一个模型里定义了ImageField,以下面这个为例:class Example(models.Model) image = models.ImageField( blank=True, upload_to=my_image_path, )当我上传图片的时候,django返回了这样一个错误:Ensure this filename has at most 100 characters (it has 107)。在django文档中,我们可以发现:FileField 实例在数据库中被创建为 varchar 列,默认最大长度为 100 个字符。与其他字段一样,你可以使用 max_length 参数改变最大长度。并且要知道ImageField是FileField的子类:继承 FileField 的所有属性和方法,但也验证上传的对象是有效的图像。ImageField 实例在数据库中创建为 varchar 列,默认最大长度为 100 个字符。与其他字段一样,你可以使用 max_length 参数改变最大长度。因此,想要解决这个问题,我们只需要像平常的CharField一样,在ImageField的选项中加入max_length:class Example(models.Model) image = models.ImageField( blank=True, upload_to=my_image_path, max_length=500 )改完之后,不要忘了更新数据库,做数据迁移:python manage.py makemigrations python manage.py migrate
2024-06-07 22:05:31

Vue3+Django实现保持登录状态

Request.session对象会自动生成一个cookie,该cookie名字默认为sessionoid,储存session的session_key值。当会话session过期后,该cookie将会自动消失。只有该cookie清空后,登录后的用户才能重新登录。 通过后端设置session的过期时间,时间到后,通过浏览器可以看到,cookie自动消失了。因此只需要设置,用户存在localStorage中的token值跟着cookie一起消失,就能够通过设置session的过期时间,来控制用户保持登录状态的时间,如七天免登录。 我们可能会认为其实可以根据cookie来控制登录状态,实际上想要在vue中操作cookie值是不容易。在JavaScript中,我们可以通过document.getElementId()之类的指令来控制cookie。但在vue中,使用document的指令很可能会得到空的返回值。因此,不能通过直接控制cookie的方法来实现控制登录状态。 因此,我们需要在后端多写一个接口,来检验token的有效性,从而控制用户的登录状态。 注意:cookie只会影响用户是否能够再次登录,而vue中判断用户登录,使用cookie不方便,因此只能使用token来实现。然而token跟cookie在前端是独立的,因此如果cookie过期了,而token没清除,就会导致一直保持登录,而token清除了,cookie没过期,就会导致登录状态结束后,用户无法登录。
2024-05-02 18:25:10

Djano云服务器部署 uwsgi+nginx+https部署

Django启动服务器的命令runserver,其实也是启动了一个自带的uwsgi服务。如果想要一直在后台不停的运行django项目,需要部署uwsgi服务器。uwsgi安装官方文档:安装uWSGI — uWSGI 2.0 文档 (uwsgi-docs-zh.readthedocs.io)可以直接用pip安装uwsgi:pip install uwsgi在django项目根地址,即跟manage.py同目录下新建配置文件uwsgi.ini,如:mysite1/uwsgi.iniuwsgi.ini必须以[uwsgi]开头,内容如下:[uwsgi] chdir=/mysite1 module=mysite1.wsgi:application socket=127.0.0.1:8000 master=True pidfile=uwsgi.pid vacuum=True max-requests=5000 daemonize=uwsgi.logchdir为django项目根地址,socket为django启动服务器的ip地址,daemonize为日志地址。注意,每个django项目中自动生成一个mysite1/wsgi.py文件。接下来cd 到 uWSGI 配置文件所在目录,执行以下代码即可:uwsgi --ini uwsgi.iniuWSGI的运行说明无论是启动还是关闭,都要执行ps aux|grep 'uwsgi’确认是否符合预期当uwsgi启动后,当前django项目的程序已变成后台守护进程,在关闭当前终端时此进程也不会停止启动成功后,进程在后台执行,所有日志均输出在配置文件所在目录的uwsgi.log中Django中代码有任何修改,都需要重启uwsgi(重启即为先关闭,再开启)配置好uwsgi服务后,还需要进一步配置nginx服务器,原因见为什么有了uwsgi 还要 nginx 服务器?和Nginx服务器反向代理。为了更高的加密性,我们可以使用nginx配置HTTPS协议。以下我们以腾讯云服务器为例,通过nginx配置HTTPS:首先找到/etc/nginx/conf.d,然后创建新文件django_nginx.confsudo vim django_nginx.conf接下来输入以下设置# 这种写法比较方便配合负载均衡 upstream backend { # 这里的IP端口即Django项目的IP端口 server 127.0.0.1:8000; # 如果uwsgi使用的本地文件,此处写法参考 # server unix:/path/to/your/mysite/mysite.sock; } server { listen 443 ssl; autoindex on; client_max_body_size 1024m; #请填写绑定证书的域名 server_name example.com; #请填写证书文件的相对路径或绝对路径 ssl_certificate example.com_bundle.crt; #请填写私钥文件的相对路径或绝对路径 ssl_certificate_key example.com.key; ssl_session_timeout 5m; #请按照以下协议配置 ssl_protocols TLSv1.2 TLSv1.3; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location /static { alias /path/to/your/mysite/static/; } location / { include uwsgi_params; uwsgi_pass backend; } }最后重新加载nginx,就大功告成啦!sudo nginx -s reload
2024-05-15 10:46:48

为什么有了uwsgi 还要 nginx 服务器?

有关nginx的简单介绍,详见Nginx服务器反向代理。uwsgi是python的一个通信协议,同时也是一种web服务器,而nginx则是高性能反向代理的web服务器。在Django项目服务器部署中,uwsgi几乎是不可替代的。然而部署好了uwsgi,其实django接口已经能够响应请求,为什么还要额外配置nginx服务器?因为,相比于直接将真实地址暴露在公网上,在外面套一层nginx安全性更高,具体如下:安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。静态文件处理效率问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。这就是这几者之间的关系。
2024-05-15 00:06:04

How to split views.py to several smaller files in Django

When your views.py is too large, it becomes much more difficult to manage your code. So you might want to split views.py into several subviews, each of which contains a single sort of views.To split views.py, you could follow the following steps. Your original views.py might look like this:import ... def view1(request): pass def view2(request): passNow, create a new folder subviews aside with views.py , i.e. /Django/mysite/MyAPI/subviews. Next, create __init__.py, viewsa.py, and viewsb.py in the folder subviews to form the following folder/file structure :subviews/ __init__.py subviews1.py subviews2.pysubviews1.py :from .views import * def view1(request): passsubviews2.py :from .views import * def view2(request): pass__init__.py :from subviews1 import * from subviews2 import *Then this would work the same as a single views.py file. Don't forget to change the urls.py file before you reloading Django.
2024-05-01 14:11:30

Django combine multiple QuerySets

Suppose that we have two different models.class Author(models.Model): name = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author)In certain circumstances, you might want to merge two querysets into one queryset. For example, you may want to combine Author.objects.all() and Article.objects.all(). You could accomplish this by pure python method itertools.chain, or using Django's inbuilt queryset method union . However, these are no more intuitive than combining two querysets directly.We recommend to use the package django-querysetsequence. To combine Author.objects.all() and Article.objects.all(), you just need to call QuerySetSequence directly :from queryset_sequence import QuerySetSequence authors = Author.objects.all() articles = Article.objects.all() authors_articles = QuerySetSequence(authors, articles)If you have multiple models A, B, C, D, E, F , and have an array data containing their querysets, e.g. A.objects.all(), B.objects.all() , etc. To combine querysets in an array, you could make use of python's inbuilt method reduce :from functools import reduce from queryset_sequence import QuerySetSequence q = reduce(QuerySetSequence, data)
2024-05-03 00:33:49

Django对RawQuerySet进行计数

提问你好,我使用的是django 1.2,然后我想知道如何对原生查询集(RawQuerySet)的行进行计数。惯例的.count()方法行不通。这是我的查询query = "SELECT *, ((ACOS(SIN(%s * PI() / 180) * SIN(lat * PI() / 180) + COS(%s * PI() / 180) * COS(lat * PI() / 180) * COS((%s - lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance FROM app_car WHERE price BETWEEN %s AND %s HAVING distance<=%s ORDER BY distance ASC" cars = Car.objects.raw(query, [lat, lat, lon, min_price, max_price, miles]) return HttpResponse( cars )然后它的返回值是Car_Deferred_model_id_user_id object大家有什么想法吗?回答1使用'len()'函数,这会带来:query = "SELECT *, ((ACOS(SIN(%s * PI() / 180) * SIN(lat * PI() / 180) + COS(%s * PI() / 180) * COS(lat * PI() / 180) * COS((%s - lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance FROM app_car WHERE price BETWEEN %s AND %s HAVING distance<=%s ORDER BY distance ASC" cars = Car.objects.raw(query, [lat, lat, lon, min_price, max_price, miles]) return HttpResponse(len(list(cars))另外:这里有一些关于Django 1.2 Model.objects.raw()方法的有用信息: http://djangoadvent.com/1.2/smoothing-curve/ 【看起来该网站可能已经过期,但Internet Archive将其保存在:http://web.archive.org/web/20110513122309/http://djangoadvent.com/1.2/smoothing-curve/ 】内容来源于StackOverflow, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:Django count RawQuerySet
2024-08-21 18:49:27

Django将已经存在的字段改为外键

我有一个Django模型,它之前是这样的class Car(models.Model): manufacturer_id = models.IntegerField()然后还有另一个名为Manufacturer的模型,id字段所指的就是它。然而,后来我意识到使用Django自带的外键功能,会更方便。因此,我将这个模型改为现在这样class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer)这次修改似乎一下就弄好了,查询出来的结果也没有任何报错,但是当我试着运行数据迁移的时候,Django输出了以下结果- Remove field manufacturer_id from car - Add field manufacturer to car执行这个迁移会清除所有已经存在于数据库里的关系,所以我并不想这么做。我其实并不想做任何的迁移,毕竟像Car.objects.get(manufacturer__name="Toyota")这样的查询没有一点问题。我更想要一个恰当的数据库外键限制,但不是高优先级的那种。总的来说,我的问题是:是否存在一种迁移方法或者别的,能让我将一个已经存在的字段转变为外键?我不能使用--fake因为我需要可靠地在开发、生产和同事的电脑上工作。内容来源于 Stack Overflow, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:Django change an existing field to foreign key
2024-08-17 16:03:04

django对象报错object has no attribute 'count'

提问我正在学习django/python,并被一个问题给卡住了。我有一个视图:create_document.py,我想在其中计算模型类NameDetails中的名字细节数量。但我不知道正确的写法!这是我models.py的代码:class NameDetails(FillableModelWithLanguageVersion): user = models.ForeignKey(User) name_details_prefix_title = models.CharField(null=True, blank=True, max_length=25) name_details_first_name = models.CharField(null=False, blank=False, max_length=50) name_details_middle_name = models.CharField(null=True, blank=True, max_length=100) ....这是我create_document.py的代码,里面用到了django wizard。我想要确定的是用户在他们能够创建文档前,至少有一个名字。from app_name.core.models import NameDetails class CreateDocumentWizard(SessionWizardView): template_name = 'documents/document_create.html' form_list = [ core_forms.CreateDocumentWizardForm01, core_forms.CreateDocumentWizardForm02, core_forms.CreateDocumentWizardForm03, core_forms.CreateDocumentWizardForm04, ] def get_form_kwargs(self, step=None): kwargs = super(CreateDocumentWizard, self).get_form_kwargs(step) kwargs.setdefault('user', self.request.user) return kwargs def get_context_data(self, form, **kwargs): name_details_count = NameDetails(user=self.request.user).count() if name_details_count < 1: return redirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)当我使用name_details_count = NameDetails(user=self.request.user).count()确定用户的NameDetails计数时,我得到了以下错误:NameDetails' object has no attribute 'count'我已经尝试了很多种组合,但现在还是卡住了。回答1你的get_context_data函数应该这样写:name_details_count = NameDetails.objects.filter(user=self.request.user).count()回答2眼下你正在以request.user为用户创建一个全新的NameDetails实例。相反,你应该查询数据库中当前用户已有的NameDetails,并对他们进行计数。你可以通过NameDetails.objects查询数据库:name_details_count = NameDetails.objects.filter(user=self.request.user).count()内容来源于StackOverflow, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:django object has no attribute 'count'
2024-08-21 17:45:15