一个完全不了解Rails的人接触Django后,对Rails和Django的差异感到惊讶
首先
提到Ruby on Rails,就是众所周知的基于Ruby开发的Web框架。它被广泛应用于各种创业公司,可以说是世界上最受欢迎的Web框架之一。在过去的一年里,我几乎只使用Rails进行开发。
与Rails经常被对比的是Python开发的Web框架Django。它也非常受欢迎,可以在网上看到很多比较Django和Rails的文章,特别是针对初学者。
我一直以为Django与我无缘,但最近我有机会帮助一个熟人的Django项目。他们告诉我:“如果你会Rails,那你也会Django!”我以轻松的心态开始帮助,但事实上,我发现Django与Rails有很多不同之处。今天我想和大家分享其中的一些(这只是我个人通过简单接触得出的感想,如果有更深层次的区别,或者有什么不正确的地方,欢迎指正)。
Django和Rails之间的区别是什么?
从Python文件manage.py中调用各种命令。
Rails提供了一个可以在命令行上运行的rails命令。通过使用这个命令,您可以执行与开发相关的各种操作。例如,
rails server
在中国的服务器上启动。
rails db:migrate
可以反映迁移文件的内容到数据库中。
另一方面,在Django中,当创建项目时,会在项目的根目录下创建一个名为manage.py的文件,就像下面这样。
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
即使是对 Python 毫无经验的人,他们也可以理解通过 execute_from_command_line 这个看起来很明确的东西将命令行参数注入并执行的过程。
通过这个,例如搭建服务器的事项是可以实现的。
python manage.py runserver
将迁移文件的更改应用
python manage.py migrate
开始开发时,我认为Django也会像Rails一样有django命令,因此尝试调用它。当我知道只需要执行一个python文件时,我感到非常奇怪。虽然只是细微的差别,但对于已习惯于Rails的我来说,这非常令人惊讶。
默认配备管理网站

这个模型不是MVC模型,而是MTV模型所创建的。
在具有使用过Web框架的人中,很少有人听说过MVC模型这个词。这种思想将应用程序分割为执行业务逻辑的Model、呈现给用户的部分的View,以及将这两者连接起来的Controller。多年来,许多框架都按照这种思想构建。
Rails也不例外。Controller接收请求,Model进行各种处理,并将结果填充到View中展示给用户。
Django使用的不是这种MVC模型,而是被称为MTV的模型,由Model、Template、View组成。但实际情况基本上与MVC模型没有太大区别。View接收请求,Model进行各种处理,并将结果填充到Template中展示给用户。
这里比较复杂的是,View的角色在两者之间完全不同。简单地说,Rails中的View就是Django中的Template,Django中的View就是Rails中的Controller。这是非常重要的事情,所以我再说一遍。Rails中的View就是Django中的Template,Django中的View就是Rails中的Controller。真的很复杂……
HTML模板中不能嵌入的语言不是Python。
为了根据内部处理来更改绘制的HTML,许多Web框架允许用户在服务器端嵌入用于显示的HTML所使用的语言。Rails中最流行的方法是使用erb文件。相对而言,您可以相对直观地将Ruby代码嵌入视图中。例如,在Rails项目中,让我们创建一个文件,只在第三个p标签上显示“傻瓜”。
<% for i in (1..10) %>
<% if i % 3 == 0 %>
<p>アホ</p>
<% else %>
<p>賢い!</p>
<% end %>
<% end %>

那么,如果我们尝试用Django来完成相同的事情,会是怎样的呢?根据Python的语法和Django的模板文件编写方式,我们尝试做相同的事情应该如下所示。
{% for i in range(1, 11) %}
{% if i % 3 == 0 %}
<p>アホ</p>
{% else %}
<p>賢い!</p>
{% endif %}
{% endfor %}
TemplateSyntaxError at /account/teacher/history/
'for' statements should use the format 'for x in y': for i in range(1, 11)
哎呀,在尝试绘制时出现了错误。尽管Python语法似乎没有错误,但为什么会出错呢?
原因是在用Django绘制的模板中嵌入的语言不是Python,而是被称为Django模板语言的“类似Python”的语言。
Django模板只能使用嵌入的变量和称为标签的非常有限的函数。
内置的标签/过滤器参考
除此之外,无法使用任何其他Python内置函数等。在上面的模板中,例如,range函数和%运算符无法在Django模板中使用。
那该怎么办呢?作为解决方法,可以
-
- View中で変数に情報を詰め込む
- 新しいタグを自作する
有两种可能的选择。(是的,在Django中可以自定义标签。详细信息请参阅以下链接。可以自定义模板标签和过滤器)
在此示例中,首先在View内执行range(1, 11),并将结果存储在变量numbers中。然后,定义一个名为nabeatsu的标签,如果参数是3的倍数,则返回“アホ”,否则返回“賢い!”。然后,
{% for i in numbers %}
<p>{{ i | nabeatsu }}</p>
{% endfor %}
使用以下方式描述将获得相同的结果。
在Rails开发中,由于我在View中经常自由地编写Ruby代码,所以当我第一次接触Django模板语言时,实现并不如意,感到很沮丧。但请记住,MVC中的View角色是什么。View是向用户展示信息的地方,而不是编写逻辑的地方。
在Django官方文档中,有如下描述。
如果您拥有编程知识,并且有使用将类似于PHP的程序代码直接混合到HTML中的语言的经验,那么您可能会对Django模板系统不仅仅是将Python嵌入到HTML中这一点产生疑问。然而,这是设计上故意决定的。模板系统是用来表示表现层的,而不是编程逻辑。
只需要一种选项:http://djangoproject.jp/doc/ja/1.0/topics/templates.html
Django通过设计意图,在某种程度上限制了一些“不好”的写法。虽然这个事实让我反思自己的编码方式,但我也不禁感叹Rails的视图自由度。
最后
我依然热爱Rails。然而,通过接触略有不同风格的Django,我能够感受到Rails独有的元素存在于何处,反思自己使用Rails的方式,并获得各种不同的学习机会。即使您觉得Rails非常好用,离不开它,为何不稍微尝试一下其他框架呢?