企业级Web应用的Django
我想知道Django是否适合用来开发大型网站应用(比如社交网络)?更具体一点,我想了解当数据库操作增多时,性能方面有什么建议。同时,我也想知道Django里面自带的对象关系映射(ORM)是否好用,还是说我应该自己去实现一个。
谢谢!
3 个回答
1
我公司刚为一个大型企业搭建了这样一个系统,使用的是Django框架,还包括了所有的移动系统。用Django开发的成本很低,而且在企业的服务器上运行也没有问题。甚至Django还帮助我们通过了渗透测试和安全测试。如果用其他语言的话,我们在极限预算的情况下是无法完成这个项目的。
3
我想补充一点,企业应用在使用Django的ORM(对象关系映射)时,可能会遇到一个大问题,就是它的能力有点有限(也就是说,它能表达的查询有局限)。不过,我觉得这个问题是可以通过以下两种方式来解决的:
- 尽量在Django的ORM中表达查询,尽量不要轻易认为某个查询在Django中做不到,特别是如果你没有经验的话。
- 如果某个查询在Django中确实做不到(如果你不确定,可以去IRC #django频道或者django-users小组问问),那么就把这个查询存放在一个叫queries.py的文件里,方便数据库管理员管理或查看。(这个文件可以是一个简单的字典,供你的模型文件引用。)
举个例子来说明第二点:你完全可以写一个查询存储管理器,像这样使用:假设你有一个叫blogs的应用,里面有一个叫Entry的模型:
# models.py
class Entry(models.Model):
objects = project.QueryStorageManager()
author = models.ForeignKey(User)
body = models.TextField()
slug = models.CharField(max_length=512)
published_date = models.DateField()
@project.StoredQuery("getEntryMonthHistogram")
def getEntryMonthHistogram(self, sql, author):
return objects.runQuery(sql, author)
# queries.py
{
"getEntryMonthHistogram": """SELECT EXTRACT(MONTH FROM published_date),
REPEAT('*', count(*)) histogram
FROM blogs_entry
WHERE author_id = %s""",
}
5
当数据库事务数量增加时,性能会受到影响。
这其实不是Django的问题。
你可以通过Apache和mod_wsgi同时运行很多Django会话,它们都会共享同一个数据库。
所以,这完全是数据库的问题。你应该能够配置足够的Apache/Django会话,让你的数据库忙得不可开交。
Django里面的ORM映射是个好选择,还是我应该自己实现?
没错,这是个很好的选择。
在你能证明ORM是你性能瓶颈之前,尽量使用它。
随着你业务的扩大,你会重新设计你的数据库、缓存和其他架构特性。因为ORM有缓存(你的数据库也有),所以在这方面你很少会遇到性能问题。
你可以这样做。
不过,大部分性能问题会出现在通过Apache下载静态媒体文件的时候。