草庐IT

Ruby on Rails还是Django?做网站开发应该学习哪一个

GeniusBin 2023-09-28 原文

Rails和Django都是非常优秀的网站开发框架,纠结应该学习Rails还是Django的人,大概有下面几种:

  1. 想找后端开发工作的
  2. 自己玩票搞副业的

对于已经工作的职业程序员们来说,绝对不会纠结Rails和Django该选哪一个,因为公司的技术栈是啥你就得学啥,没得商量。
对于想找后端开发工作的,我不是资深业内人士,无法给出合理建议。
对于玩票的那些人,比如想了解一下网站开发技术、MVC框架的设计师,我推荐Django。没错就是这么直接。

在我自己陷入了应该学Rails还是Django的迷思中后,我把Ruby On Rails官方文档Django官方文档都翻了一遍,还翻到了一篇很棒的2014年的技术对比。这里我把思考的过程记录下来,以免后面自己忘了又重新比较一遍……

其实Rails和Django之间的选择,就是两者之间开发哲学的选择。

Rails创始人David Heinemeier Hansson设定的信条是:

  1. 程序员的幸福最大化
  2. 约定优于配置
  3. 主厨精选
  4. 多元化的设计模式
  5. 推崇优美的代码
  6. 提供实用工具
  7. 重视整合系统
  8. 进步比稳定更重要
  9. 包容并重

而Python中的彩蛋import this则是:

$ python
>>>import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

对比两者的第二条(真巧):

约定优于配置
Convention over Configuration

VS
显式优于隐式
Explicit is better than implicit

约定优于配置的哲学,可以让熟悉开框架的人快速实现程序功能,而不需要把时间花费在从零开始的配置文件设置上。那种感觉,就像是闭着眼睛往前走,不怕前方没有路,因为你知道,即使看不见,Rails也已经在前方给你铺好了路。而这个特性,对于不熟悉开发框架的人来说,就有点“魔幻”了。

显式优于隐式的哲学,可以让不熟悉框架的人也能明确知道代码在做什么,如果不懂,照着代码读一遍就懂了。而这一点对于已经很熟悉框架的人来说就显得很麻烦,“我知道所有的事情,我还要把我已经知道的东西再重新写一遍”。

现在,搞清楚我们学习Rails或者Django的目标:玩票。显式优于隐式的哲学对新人和非专业人士来说非常友好,毕竟这次玩票之后下次再玩票可能就是几个月之后了,我可不想到时候看着自己写的代码一脸茫然,不得不再重新拿起官方文档学一遍。

我推荐Django还有另外一个原因:框架背后的语言。Rails基于Ruby,Django基于Python。

Ruby是很优秀的脚本语言,我尝试写过一些之后也觉得:真爽。可选的函数括号、符号特性等等。对比一下Ruby和Python的自动化测试脚本:

# Ruby
require "selenium-webdriver"
driver = Selenium::WebDriver.for :chrome
driver.manage.timeouts.implicit_wait = 10
driver.navigateTo "www.baidu.com"
c = driver.find_element(:id, "content")
c.send_keys "hello world"
btn = driver.find_element(:id, "submit")
btn.click

# Python
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("www.baidu.com") 
c = driver.find_element(By.id, "content")
c = driver.find_element_by_id("content") #上一句的另一种写法
c.send_keys("hello world")
btn = driver.find_element_by_id("submit")
btn.click()

可以看到号称自然语言的Python,其“自然”程度输给了Ruby。而且Ruby还有5.times puts “hello world”等等各种魔幻的语法。

只可惜虽然Ruby的语法比Python爽那么多,但架不住Python在各个领域遍地开花。Python可以干嘛呢?PyGame写游戏,PyQt写桌面GUI程序,Pandas搞数据分析,Scrapy写大型网络爬虫,Matplotlib搞数据可视化,TensorFlow搞深度学习。Django写多了,拿Python做点其他的事情完全不是问题。Ruby虽然也可以做点其他的事情,跟Python比起来就相形见绌了。

Python还有一个Jupyter Notebook,交互式的代码编写方式,对于还处在学习阶段的人来说简单是神器。

还有一点,Django/Python的开发环境搭建因为有virtualenv这个工具非常简单,而Rails/Ruby的就麻烦多了,尤其是在Windows系统上。以致于出现了一个网站教入门新手如何搭建开发环境:http://installrails.com

所以,总结一下,玩票推荐Django的原因:

  1. 显式优于隐式的哲学,不怕三天打渔两天晒网自己忘记代码怎么写的了
  2. Python除了网站,还能做其他很多事情,适合玩票
  3. Jupyter Notebook极大降低了入门成本
  4. 开发环境搭建容易

有关Ruby on Rails还是Django?做网站开发应该学习哪一个的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  7. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  8. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

随机推荐