如何强制 Django 进行js不区分大小写比较的比较

相关文章推荐
Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:
1、用root登录,修改 /f;
2、在[mysqld]节点下,加入一行: lo...
查看mysql的相关安装路径:
ps -ef|grep mysql
包括mysql的安装路径,数据库存放路径,运行路径等。
除了这个方式,还可以输入该命令查看:
问题描述:今天在做客户端登录的时候,发现用小写的字母也能同样验证通过,于是就去网上查找相关知识。发现mysql查询时,存在不区分大小写的情况。可以通过binary关键字加以解决。
解决方法有两种: ...
SQLServer 强制区分大小写
刚刚使用sql server没有几天, 发现一个很郁闷的问题, sql server 竟然不区分大小写...
转载自:/origin_zmn/blog/static/2/
BINARY不是函数,是类型转换运算符,它用来强制...
今天在写一个项目的时候,在登录界面输入用户名david(数据库存值为David)竟然也能登录成功,百思不得其解之后问了下百度老师。经过查询才得知是建表的时候没有对字段
属性进行设值区分大小写的校对。...
问题最近,在用SSH框架完成一个实践项目时,碰到了一个莫名其妙的Bug困扰了我好久,最后终于解决,记录如下。
问题:同学在测试系统的时候突然发现,数据库保存的账户本来应该是admin,结果该同学用...
MYSQL在默认的情况下查询是不区分大小写的,例如:
mysql> create table t1(
-> name varchar(10));
Query OK, 0 rows affec...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)django orm总结--解决查询结果不区分大小写问题
时间: 22:55:05
&&&& 阅读:1554
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&目录1.1.1 生成查询1.1.2 创建对象1.1.3 保存修改的对象1.1.4 保存 ForeignKey 和 ManyToManyField 字段1.1.5 检索对象1.1.6 检索所有的对象1.1.7 过滤检索特定对象1.1.8 链接过滤1.1.9 过滤结果集是唯一&1.2.1 结果集是延迟的&1.2.2 其他的QuerySet方法1.2.3 限制 QuerySets1.2.4 字段查找1.2.5 跨关系查询1.2.6 过滤器可参考模型字段1.2.7 缓存查询集1.2.8 比较对象1.2.9 删除对象1.3.1 一次修改多个对象1.3.2 关系对象1.3.3 One-to-many关系1.3.4 Many-to-many关系1.3.5 One-to-one关系1.1.1 生成查询你创建完数据模型,django会自动提供给你数据库抽象的API,可以创建、获取、修改、删除对象,本篇文档讲解如何使用API。我们参考下面模型,一个weblog:#博客class&Blog(models.Model):
&&&&name&=&models.CharField(max_length=100)
&&&&tagline&=&models.TextField()&&&&def&__unicode__(self):&&&&&&&&return&self.name#作者class&Author(models.Model):
&&&&name&=&models.CharField(max_length=50)
&&&&email&=&models.EmailField()&&&&def&__unicode__(self):&&&&&&&&return&self.name#目录class&Entry(models.Model):
&&&&blog&=&models.ForeignKey(Blog)
&&&&headline&=&models.CharField(max_length=255)
&&&&body_text&=&models.TextField()
&&&&pub_date&=&models.DateTimeField()
&&&&authors&=&models.ManyToManyField(Author)
&&&&n_comments&=&models.IntegerField()
&&&&n_pingbacks&=&models.IntegerField()
&&&&rating&=&models.IntegerField()&&&&def&__unicode__(self):&&&&&&&&return&self.headline&1.1.2 创建对象用python对象描述数据库表的数据,django使用一个直观的系统,一个模型类描述一个数据表,一个类的实例描述表的一条详细记录。使用模型的save()方法将对象创建到数据库。from&mysite.blog.models&import&Blog
b&=&Blog(name=‘Beatles&Blog‘,&tagline=‘All&the&latest&Beatles&news.‘)
b.save()只有执行save方法时,django才会执行sql把对象写入数据库。1.1.3 保存修改的对象保存修改仍然使用save()方法b5.name&=&‘New&name‘b5.save()1.1.4 保存 ForeignKey 和 ManyToManyField 字段cheese_blog&=&Blog.objects.get(name===&Author.objects.create(name=1.1.5 检索对象从数据库里检索对象,可以通过模型的Manage来建立QuerySet,一个QuerySet表现为一个数据库中对象的结合,他可以有0个一个或多个过滤条件,在SQL里QuerySet相当于select语句用where或limit过滤。你通过模型的Manage来获取QuerySet,每个模型至少有一个Manage1.1.6 检索所有的对象检索表中所有数据,最简单的方式是用all().all_entries&=&Entry.objects.all()1.1.7 过滤检索特定对象检索过滤特定查询结果,有两个方法。filter(**kwargs) 返回一个新的匹配查询参数后的QuerySet&exclude(**kwargs) 返回一个新的不匹配查询参数后的QuerySetEntry.objects.filter(pub_date__year=2006)1.1.8 链接过滤Entry.objects.filter(headline__startswith=‘What‘)
&&&&&&&&&.exclude(pub_date__gte=datetime.now())
&&&&&&&&&.filter(pub_date__gte=datetime())1.1.9 过滤结果集是唯一每次你完成一个QuerySet,你获得一个全新的结果集,不包括前面的。每次完成的结果集是可以贮存,使用或复用
q1&=&Entry.objects.filter(headline__startswith="What")
q2&=&q1.exclude(pub_date__gte=datetime.now())
q3&=&q1.filter(pub_date__gte=datetime.now())三个QuerySets是分开的,第一个是headline以"What"单词开头的结果集,第二个是第一个的子集,即pub_date不大于现在的,第三个是第一个的子集 ,pub_date大于现在的1.2.1 结果集是延迟的QuerySets是延迟的,创建QuerySets不会触及到数据库操作,你可以多个过滤合并到一起,直到求值的时候django才会开始查询。如:q&=&Entry.objects.filter(headline__startswith="What")
q&=&q.filter(pub_date__lte=datetime.now())
q&=&q.exclude(body_text__icontains="food")print&q虽然看起来执行了三个过滤条件,实际上最后执行print q的时候,django才开始查询执行SQL到数据库。1.2.2 其他的QuerySet方法大多数情况你使用all()、filter()和exclude()1.2.3 限制 QuerySets使用python的数组限制语法限定QuerySet,如:取前5个Entry.objects.all()[:5]&取第五个到第十个Entry.objects.all()[5:10]&一般的,限制QuerySet返回新的QuerySet,不会立即求值查询,除非你使用了"step"参数Entry.objects.all()[:10:2]
Entry.objects.order_by(‘headline‘)[0]
Entry.objects.order_by(‘headline‘)[0:1].get()1.2.4 字段查找字段查找是指定SQL语句的WHERE条件从句,通过QuerySet的方法filter(), exclude()和get()指定查询关键字。基本查询field__lookuptype=value例如:Entry.objects.filter(pub_date__lte=‘‘)转换为SQL:SELECT&*&FROM&blog_entry&WHERE&pub_date&&=&‘‘;如果你传了无效的参数会抛异常&数据库API 支持一些查询类型,下面体验一下:a、exactEntry.objects.get(headline__exact="Man&bites&dog")等价于SELECT&...&WHERE&headline&=&‘Man&bites&dog‘;如果查询没有提供双下划线,那么会默认 __exact=Blog.objects.get(id__exact=14)&#&Explicit&formBlog.objects.get(id=14)&#&__exact&is&impliedb、iexact——忽略大小写Blog.objects.get(name__iexact="beatles&blog")blog title会匹配 "Beatles Blog", "beatles blog", 甚至 "BeAtlES blOG".c、contains——包含查询,区分大小写Entry.objects.get(headline__contains=‘Lennon‘)转化为SQLSELECT&...&WHERE&headline&LIKE&‘%Lennon%‘;icontains 不区分大小写startswith,endswith,istartswith,iendswith前模糊匹配,后模糊匹配对于排序项是否应该大小写敏感,Django 并没有提供设置方法,这完全取决于后端的数据库对排序大小写如何处理。mysql排序规则中,utf8_general_ci 不区分大小写,utf8-bin、utf8_general_cs 区分大小写。1.2.5 跨关系查询Entry.objects.filter(blog__name__exact=‘Beatles&Blog‘)这个可以跨越你想要的深度。反向跨关系查询Blog.objects.filter(entry__headline__contains=‘Lennon‘)如果跨越多层关系查询,中间模型没有值,django会作为空对待不会发生异常。Blog.objects.filter(entry__author__name=‘Lennon‘);
Blog.objects.filter(entry__author__name__isnull=True);
Blog.objects.filter(
entry__author__isnull=False,
entry__author__name__isnull=True);1.2.6 过滤器可参考模型字段目前给的例子里,我们建立了过滤,比照模型字段值和一个固定的值,但是如果我们想比较同一个模型里的一个指端和另一个字段的值,django提供F()——专门取对象中某列值的操作from&django.db.models&import&F
Entry.objects.filter(n_pingbacks__lt=F(‘n_comments‘))注:n_pingbacks、n_comments为模型Entry属性django支持加减乘除和模计算Entry.objects.filter(n_pingbacks__lt=F(‘n_comments‘)&*&2)&
Entry.objects.filter(rating__lt=F(‘n_comments‘)&+&F(‘n_pingbacks‘))&
Entry.objects.filter(author__name=F(‘blog__name‘))&主键查询捷径Blog.objects.get(id__exact=14)&#&Explicit&formBlog.objects.get(id=14)&#&__exact&is&impliedBlog.objects.get(pk=14)&#&pk&implies&id__exact&不仅限于__exact 查询#&Get&blogs&entries&with&id&1,&4&and&7Blog.objects.filter(pk__in=[1,4,7])#&Get&all&blog&entries&with&id&&&14Blog.objects.filter(pk__gt=14)&跨越查询Entry.objects.filter(blog__id__exact=3)&#&Explicit&formEntry.objects.filter(blog__id=3)&#&__exact&is&impliedEntry.objects.filter(blog__pk=3)&#&__pk&implies&__id__exact&like语句转义百分号Entry.objects.filter(headline__contains=‘%‘)转义为SELECT&...&WHERE&headline&LIKE&‘%\%%‘;1.2.7 缓存查询集每个QuerySet都包含一个缓存,以尽量减少对数据库的访问。理解他的工作原理很重要,可以写出最高效的代码。在最新创建的QuerySet里,缓存是空的。在第一次QuerySet被取值,因此数据库查询发生,django把查询结果放入缓存,并返回给请求,随后的查询取值会复用缓存中的结果。保持缓存的思想习惯,因为如果你不正确使用查询缓存会有麻烦。例如下面例子会创建两个QuerySetprint&[e.headline&for&e&in&Entry.objects.all()]print&[e.pub_date&for&e&in&Entry.objects.all()]这样意味着数据库查询会执行两次,实际两次数据库加载为了避免这个问题,简单保存QuerySet复用queryset&=&Poll.objects.all()print&[p.headline&for&p&in&queryset]&#&Evaluate&the&query&set.print&[p.pub_date&for&p&in&queryset]&#&Re-use&the&cache&from&the&evaluation.1.2.8 比较对象比较两个模型实例,使用python标准的运算符,两个等号==some_entry&==&other_entry
some_entry.id&==&other_entry.id
some_obj&==&other_obj
some_obj.name&==&other_obj.name1.2.9 删除对象删除方法是很方便的,方法名为delete(),这个方法直接删除对象没有返回值e.delete()你也可以批量删除对象,每个QuerySet有一个delete()方法,能删除 QuerySet里所有对象1.3.1 一次修改多个对象有时候你想给QuerySet里所有对象的一个字段赋予特定值,你可以使用 update()方法例如:#&Update&all&the&headlines&with&pub_date&in&2007.Entry.objects.filter(pub_date__year=2007).update(headline=‘Everything&is&the&same‘)&这个方法只能用于无关联字段和外键b&=&Blog.objects.get(pk=1)#&Change&every&Entry&so&that&it&belongs&to&this&Blog.Entry.objects.all().update(blog=b)&update()方法不返回任何值,QuerySet不支持save方法,如果要执行save,可以如下:for&item&in&my_queryset:
item.save()&update也可以使用F()#&THIS&WILL&RAISE&A&FieldErrorEntry.objects.update(headline=F(‘blog__name‘))&1.3.2 关系对象当你在model里定义一个关系时,模型实例会有一个方便的API来访问关系对象。用本页上面的模型举个例子,一个Entry对象可以得到blog对象,访问blog属性e.blog。django也创建API来访问关系对象的另一边,一个blog对象访问Entry列表b.entry_set.all().1.3.3 One-to-many关系如果一个对象有ForeignKey,这个模型实例访问关系对象通过简单的属性e&=&Entry.objects.get(id=2)
e.blog&#&Returns&the&related&Blog&object.你可以凭借外键属性获取和赋值,修改外键值知道执行save()方法才会保存到数据库e&=&Entry.objects.get(id=2)
e.blog&=&some_blog
e.save()如果ForeignKey 设置了null=True 你可以赋值为Nonee&=&Entry.objects.get(id=2)print&e.blog&#&Hits&the&database&to&retrieve&the&associated&Blog.print&e.blog&#&不会在向数据库取;&使用缓存中的值.e&=&Entry.objects.select_related().get(id=2)print&e.blog&#&不会在向数据库取;&使用缓存中的值.print&e.blog&#&不会在向数据库取;&使用缓存中的值.b&=&Blog.objects.get(id=1)
b.entry_set.all()&#&返回所有blog的关联对象.#&b.entry_set&is&a&Manager&that&returns&QuerySets.b.entry_set.filter(headline__contains=‘Lennon‘)
b.entry_set.count()
b&=&Blog.objects.get(id=1)
b.entries.all()&#&返回所有blog的关联对象#&b.entries&is&a&Manager&that&returns&QuerySets.b.entries.filter(headline__contains=‘Lennon‘)
b.entries.count()&add(obj1, obj2, ...) 增加多个关系对象create(**kwargs) 建立新对象remove(obj1, obj2, ...) 去除多个关系对象clear() 清理所有关系对象b&=&Blog.objects.get(id=1)
b.entry_set&=&[e1,&e2]1.3.4 Many-to-many关系e&=&Entry.objects.get(id=3)
e.authors.all()&#&返回Entry所有authors&.e.authors.count()
e.authors.filter(name__contains=‘John‘)
a&=&Author.objects.get(id=5)
a.entry_set.all()&#&返回Author所有entry&.1.3.5 One-to-one关系class&EntryDetail(models.Model):
&&&&entry&=&models.OneToOneField(Entry)
&&&&details&=&models.TextField()
ed&=&EntryDetail.objects.get(id=2)
ed.entry&#&返回&Entry&对象.本文出自 “” 博客,请务必保留此出处标签:&&&&&&&&&原文:http://strongit./7588
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!云计算&大数据
WEB开发设计
Object Storage
Conceptual
如何扩大Django:超越基础
你已经部署Django到你的Droplet和生活是好的。你碰到了一些性能问题,网站的流量增长,但你和固定它。不过,您的网站流量持续增长。不知何故你需要更多的性能...你能做什么?
让我们深入了解我们的应用程序和服务器配置的内容。本文是基于您使用Ubuntu 12.04的假设编写的,但这些原则适用于任何版本的Linux。
如果你使用Apache,那么你应该遵循这些指令 。如果你使用Nginx,这些提示也会为你工作。
如果您已经创建了一个CMS来管理您的网站,那么您可能容忍非常积极的缓存。在这种情况下,我最喜欢的工具是Varnish,一个位于Apache或Nginx前端的前端缓存。在这种情况下,看看这个现有和本 (是的,关于PHP Nginx的文章会谈,但它会为Django的工作太)。
缺点是,Varnish,除非你仔细配置,将缓存您的整个网站。如果你有动态内容,例如如果你的网站更多的是一个应用程序,varnish可以造成很多麻烦。假设用户A访问该网站并将一个项目添加到他们的购物车。然后,用户B访问该网站,并查看其中包含用户A的项目的购物车的缓存版本。不好。
另一个缺点是,Django,默认情况下,试图强制上游缓存从缓存的内容,这导致一场战斗结束在不稳定的行为。
但我有个好消息:Django的有它自己的高速缓存架构 ,这将使你两件事。
它将使您的应用程序更易于缓存,使它与Varnish(如果你选择使用它)
它将让您控制网站的哪些部分缓存
如果你使用更小的Droplet,我建议使用数据库缓存。它很容易打开,并避免需要运行另一个服务器进程。如果你有足够的RAM 提供了极佳的缓存后端。本文将演示基于数据库的缓存。
请阅读上面链接的文档,了解许多优秀的细节,但这里是您需要做的开始。
为缓存创建数据库表。在这种情况下,我们的表称为“cache_table”:
python manage.py createcachetable cache_table
现在编辑您的settings.py文件并通过添加以下行来配置缓存:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'cache_table',
还有可配置的其他配置选项。阅读他们的 。我特别查看TIMEOUT和CULL_FREQUENCY。
现在你需要决定要缓存什么。如果你只是想使您的网站的工作更加精美,Varnish然后检查了每个站点的缓存配置 。但是这不是很令人兴奋,所以让我们深入到每个视图的缓存。
假设您有一个购物车产品页面,很少更改,并不是很动态。有一个名为观点product_detail(request, product_id)这将是完美的缓存。
您可以使用简单的装饰器为此启用缓存:
from django.views.decorators.cache import cache_page
@cache_page(60 * 60)
def product_detail(request, product_id):
这将允许该视图被缓存60分钟(60秒* 60分钟)。
再次,我想引用文档一些极好的提示 。 一个特别强大的功能是有所不同的基础上头 。如果您有一个网站被翻译成多种语言,或根据浏览器版本显示不同的内容,这可以是一个很大的帮助。
关于内容变化频繁?
如果您有半动态网站,例如您的应用程序收到很多评论或数据经常刷新,您可能会担心使用缓存。这是一个有效的关注。
首先确定可以缓存的所有视图,然后缓存它们。
第二,确定延迟时间可以容忍某人看到过时的内容。例如,具有活动评论的网站可能容许延迟1到5分钟。缓存页面只要可以。
你会惊讶,即使缓存超时10秒可以是非常有帮助的。在许多情况下,突然过载的繁忙站点通常被到达特定页面的流量攻击。
如果10,000个人在一分钟内访问您网站上的某个网页,那么当对数据库的所有查询都立即运行时,它会融化您的服务器。如果您设置了10秒的缓存,则意味着页面将每分钟仅重新生成6次,而不管有多少人请求。任何服务器都可以做到这一点!
使用会话数据的电子商务网站和网站必须非常小心。调查Vary标头的选项,看看是否可以缓存在你的情况下工作。不要害怕创造性!
网站有时会将所有HTML网页用作静态内容,并使用Ajax加载每用户会话信息。在电子商务网站的情况下,用户经常不会注意到,如果他们的购物车计数需要5秒来加载,只要他们可以正常浏览页面的其余部分。
提供静态内容
Django的内置开发服务器很高兴地提供静态内容。通常,我看到Django站点配置为供生产使用,静态内容由Django提供。
你唯一应该做的是如果你需要控制对内容的访问。但即使如此,考虑其他方式。
动态生成CSS -不,使用一个构建工具,如或更少的部署之前,建立你的CSS。 如果需要在服务器上生成周期性然后使用一个 。
经过身份验证的用户访问 -是的,你可能需要使用Django这一点。
一切 -不,让我们配置与您的Web服务器托管静态内容。
我不得不通过阅读文档静态文件前几次我知道了。我认为你应该自己阅读,但是如果你也努力,这里是一个场景,你可以使用:
在本地开发机器上,在“settings.py”中添加如下行:
STATIC_ROOT = os.path.join(BASE_DIR, "static")
然后运行manage.py命令这样:
python manage.py collectstatic
你现在应该在你的项目根目录中看到一个名为“静态”的文件夹,你会看到很多静态文件,如CSS和Javascript。特别是如果您已启用管理应用程序。
要使用这些文件,您需要配置Django,以便它知道在哪里查找它们。在settings.py文件夹中,您需要一个配置选项,如下所示:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
现在,如果你运行的开发者服务,并参观了管理区并查看任何页面的源代码,你应该看到,CSS文件正在从供应/static/admin/css/ 。
当你部署应用程序,你现在可以点Apache或Nginx的服务与/静态/开头直接指向他们到文件的文件。
如果您的应用部署到/ SRV / MyApp的/你所以具有一个名为/srv/myapp/static/admin/css/base.css那么你可以配置你的服务器是这样的:
Alias /static/ "/srv/myapp/static/"
location /static/ {
alias /srv/myapp/static/;
在这两种情况下,您只需将/ static / URL指向找到文件的硬盘驱动器上的精确位置。 Apache和Nginx可以比Django更快地提供这些服务。
如果我想快速发布网站,我使用Apache的mod_wsgi。如果我想要最好的性能,我使用uWSGI。如果你想知道如何发音,那就是“你威士忌”。
uWSGI是一个服务器进程,在Web服务器之外运行您的应用程序。对于Apache,您需要安装这些软件包:
sudo apt-get install uwsgi uwsgi-plugin-python uwsgi-plugin-cgi
如果您使用Apache作为您的网络服务器,也请安装:
sudo apt-get install libapache2-mod-uwsgi
一旦你做到了这一点,你会发现,你现在有两个新的文件夹进行配置: /etc/uwsgi/apps-available ,并/etc/uwsgi/apps-enabled ,就像你会看到你的虚拟主机配置与Apache或Nginx。
当你想创建一个新的应用程序,你把配置文件中/etc/uwsgi/apps-available ,然后创建一个从启用应用程序,一个符号链接到它。
让我们假设你做了一个项目,称为newproject,你已经把它在/srv/newproject 。 由于是典型的Django的项目,还有在settings.py文件/srv/newproject/newproject/settings.py 。
创建一个名为`/etc/uwsgi/apps-available/newproject.ini的文件,并将其编辑为如下所示:
touch-reload = /tmp/newproject
socket = 127.0.0.1:3031
workers = 2
chdir = /srv/newproject
env = DJANGO_SETTINGS_MODULE=newproject.settings
module = django.core.handlers.wsgi:WSGIHander()
现在,创建一个名为的空文件/tmp/newproject :
touch /tmp/newproject
您必须通过将文件链接到启用应用程序来激活应用程序:
sudo ln -s /etc/uwsgi/apps-available/newproject.ini /etc/uwsgi/apps-enabled/newproject.ini
然后重新启动uWSGI:
sudo service uwsgi restart
如果你检查“ps ax”的输出,你应该看到一些与你的应用程序相关的进程。
请注意,如果您有多个应用程序在同一服务器上运行,那么您需要为每个应用程序的套接字使用不同的端口。
此外,如果你更新你的应用程序,你应该简单地“Touch”文件/ tmp / newproject和uWSGI将重新加载自身。
在任何时候,你可以查看/var/log/uwsgi/app/newproject.log看到信息的消息和错误。
Apache配置
如果您使用MOD WSGI现在是关键时刻。 你应该禁用国防部 WSGI并启用mod_uwsgi。这可能会导致错误,因此在测试服务器上执行此操作,直到找到正确的配置。
sudo a2dismod wsgi
sudo a2enmod uwsgi
现在更新应用程式的设定。在你的apache配置你可能有这样一行:
WSGIScriptAlias / /srv/newproject/newproject.wsgi
你会更新为像这样:
SetHandler uwsgi-handler
uWSGISocket 127.0.0.1:3031
现在重新加载Apache配置:
sudo service apache2 reload
在您的服务器配置中,您将需要用以下代码替换现有的wsgi指令:
uwsgi_pass
127.0.0.1:3031;
uwsgi_param
UWSGI_SCHEME $
使用uWSGI的一个美好的方面是,你可以限制应用程序在内存中运行的次数。通常有一个父进程,如果你使用上面共享的配置,2工人。如果您需要更多的工作,您可以简单地编辑应用程序的.ini文件,并增加“工人”的数量。然后重新加载uWSGI与“sudo服务uwsgi重新加载”更新更改。
在增加进程数之前,请考虑使用多少服务器内存。如果你运行mod_wsgi,你应该看到内存使用减少。看看uWSGI工作人员的大小。随着应用程序的使用,它们的大小趋于增加。不是因为内存泄漏,而是因为内存中的数据集很小。
最大化利用率
在应用程序预热并使用一段时间后,请检查服务器的内存利用率。
使用命令free -m ,看看有多少内存被用于缓存/缓存与应用。键值是“免费”列中的顶部数字。理想情况下,繁忙的服务器将使用几乎所有的RAM。
如果你发现你有RAM空余,你的网站缓慢,那么挖掘什么是利用不足。
通常你会看到进程正在等待MySQL。可能需要为数据库分配更多的系统内存。这是非常常见的,因为MySQL的默认配置使用RAM非常少。
也有可能没有足够的RAM分配给磁盘缓存。你有不必要的进程占用内存吗?默认情况下,Linux将尽可能多地将RAM分配给磁盘缓存,当应用程序需要它时,会勉强放弃它。
在理想情况下,在内存受限VPS环境中永远不会发生这种情况,所有只读资产将在缓存中进行缓冲。因此摆脱不必要的后台进程。
您已经学习了一些缓存技术,包括使用Varnish缓存整个网站或在每个视图的基础上控制缓存设置。
您确保静态文件正在使用网络服务器,而不是Django。
您已经学会了如何使用uWSGI来通过从Web服务器中运行它来提高Django应用程序的性能。 (顺便说一句,感谢里卡多·帕斯卡尔对他的文档)
最后,您已经了解了为服务器应用程序分配尽可能多的内存,以最大限度地提高您的利用率。
文章分类 10
<是一个运维教程站,开始于2012年5月。这里提供如何简单的学习引导Linux/Windows系统管理员的目标。我们一直在努力提供简单易学高质量的文章。
(C)2017 Howtoing运维教程 京ICP备号-1

我要回帖

更多关于 grep 不区分大小写 的文章

 

随机推荐