js06金沙官网登录-js06.com-欢迎您

来自 计算机 2020-01-04 23:48 的文章
当前位置: js06金沙官网登录-js06.com-欢迎您 > 计算机 > 正文

Rails和Django的深度技术对比 难以取舍的公正(1)

Rails和Django的深度技艺相比较 难以取舍的公允(1卡塔尔国

自己想以一个豁免义务注解来开头上面包车型大巴内容。小编使用Django开采网址已经有四年了,无人不晓,小编怜爱Django。笔者早已写了贰个开源的行使程序app),况且小编风姿洒脱度将补丁发送到了Django.可是,小编以尽大概以公允的无奇不有写了那篇小说,那篇文章对那一个框架有称赞,也是有评论。

5个月早先自个儿在高校用Ruby on Rails做了叁个项目还要直接成功今后。笔者做地第风流倜傥件事正是留心地读书了那八个框架并对它们举办了相比较,可是笔者回想此时自己很颓靡的。当自家查找那些标题比方说:”对于那二者来说,数据库的动员搬迁是如何操作的?“、”它们的语法有如何分裂?“、”顾客认证是何许做的“)的答案时,笔者站在三个较高的角度相比了相互,开掘它们超越55%是非常肤浅的。上边包车型客车评头论脚将会回答那么些标题同不通常候相比每一种web框架是什么样操作模型、调控器、视图、测量检验的。

简短介绍

七个框架都以为了越来越快的支出web应用程序和更加好的团体代码那五个须要现身的. 它们都坚决守住 MVC 原则, 这意味着域模型层)的建立模型,应用程序的表现视图层)甚至顾客交互作用调控层)三者之间都是互为分开的. 附带说澳优(Ausnutria Hyproca卡塔尔(قطر‎下, Django 实际上只酌量了让框架做调节层的做事,由此Django 本身声称它是三个模型-模板-视图model-template-view)框架. Django 的模版可以被精晓为视图,而视图则足以视作是MVC规范气象中的调控层. 本文中本身将皆以用职业的MVC术语.

Ruby on Rails

 

Ruby on Rails (Ro奥迪Q5卡塔尔国是二个用 Ruby 写就的web开荒框架,并且Ruby“famous”也时一时被认为是归功于它的. Rails 重视重申了预订大于配置和测验那三个方面. Rails 的预订大于配置CoC)意味着差不离一向不陈设文件, 独有达成预订好的目录结交涉命名准则. 它的每大器晚成处都藏着众多小法力: 自动引进, 自动向视图层传递调节器实体,一大堆诸如模板名称那样的事物都是框架能自动测算出来的. 那也就象征开辟者只需求去钦赐应用程序中从未约定的生机勃勃对, 结果正是通透到底简单的代码了.

Django

Django 是一个用 Python 写成的web开垦框架,并以吉他手 Django Reinhardt 命名. Django 现身的心理在于 "成品部密集的最后时间限定和支出了它的有涉世的Web开荒者他们的严酷必要". Django 遵从的平整是 明显的认证要比深晦的隐喻要好 (那是一条为主的 Python 原则State of Qatar, 结果正是不怕对框架面生的人,代码都以特别具有可读性的. 项目中的Django是环绕app协会的.  每四个app都有其和煦的模型,调整器,视图以至测量检验设置,进而像四个小品种同样. Django 项目基本上就是一个小app的联谊, 每三个app都负责三个一定的子系统.

模型Model)  

让我们先从看看各类框架怎么样管理MVC原则起首. 模型描述了数据看起来是怎么着样子的,何况还含有了职业逻辑.

创设模型

Rails 通过在尖峰中运营多个命令来创设模型.

rails generate model Product name:string quantity_in_stock:integer                                category:references 

该命令会自动生成贰回迁移和三个空的模子文件,看起来像上面那样:

class Product < ActiveRecord::Base     end 

鉴于自家有Django的本领背景, 令本人很恼火的三个真相就是作者无法只通过模型文件就了然到多少个模子有怎么着字段. 作者通晓到Rails基本上只是将模型文件用于专门的学业逻辑,而把模型长什么样存到了二个名叫schemas.rb 的文本中. 那么些文件会在历次有迁移运转时被自动更新. 假若大家看看该公文,大家得以见见大家的 Product 模型长什么样子.

create_table "products", :force => true do |t|    t.string   "name",    t.integer  "quantity_in_stock",    t.integer  "category_id",    t.datetime "created_at", :null => false   t.datetime "updated_at", :null => false end 

在此个模型中您能够看出多少个附加的属性. created_at 和 updated_at 是七个会被电动增添到Rails中的每一种模型中的属性.

在 Django 中,模型被定义到了二个名称为models.py的文件中. 同样的 Product 模型看起来大概会像上边那样

class Product(models.Model):      name = models.CharField()      quantity_in_stock = models.IntegerField()      category = models.ForeignKey('Category')      created_at = models.DateTimeField(auto_now_add=True) # set when it's created      updated_at = models.DateTimeField(auto_now=True) # set every time it's updated 

只顾,大家亟须在Django中鲜明的也正是协调手动的)增添created_at 和 updated_at 属性. 大家也要通过auto_now_add 和 auto_now 四个参数告诉 Django 这几个属性的作为是什么样定义的.

模型Model)字段私下认可值和外键

Rails将暗许允许字段为空。你能够在下边包车型大巴事例中观望,大家创制的三个字段都被允许为空。援用字段种类也将既不创制索引,也不创立叁个外键节制。那意味援引完整性是无法保障的。Django的字段默许值是截然相反的。未有字段是被允许为空的,除非明显地设置。Django的ForeignKey将自动成立贰个外键约束和目录。就算Rails这里的创设可能是由于品质的忧虑,但自己会站在Django那边,作者百依百顺这几个制订可防止止不测)不好的布置和古怪的情景。譬释尊讲,在大家的品类中早先有贰个学子未有意识到他创设的有所字段都被允许空null)作为暗中认可值。生龙活虎段时间后,咱们开掘我们的意气风发对表包罗的数目是聊无意义的,如一个使用null作为标题标轮询。由于Rails不增添外键,在我们的例证中,我们能够去除贰个相接引用别的产物的门类,这么些产物将会有不行引用。少年老成种选取是应用三个第三方应用程序,增添对机动创造外键的援救。

迁移Migrations)

搬迁允许数据库的方式(schemaState of Qatar在成立之后方可另行更动(实际上,在Rails中全体的剧情都接收迁移,纵然是创办卡塔尔。作者只好钦佩Rails一直以来扶植这性子格。通过使用Rails的生成器(generator卡塔尔国就可以成功专业。

$ rails generate migration AddPartNumberToProducts part_number:string 

那会向Product模型(modelState of Qatar增加三个名叫part_number的新字段(田野先生卡塔尔(قطر‎。

但是Django只可以由此名称为South的第三方库来辅助迁移。我备感South的点子更是简洁和实用。下面对应的动员搬迁专业得以直接编辑Product模型的概念并增加新的字段

class Product(models.Model):      ... # 旧字段      part_number = models.CharField() 

接下来调用

$ python manage.py schemamigration products --auto 

South会自动识别到七个新扩展字段增多到Product模型并创造迁移文件。随后会调用上边施命发号完毕生机勃勃道(synced卡塔尔(قطر‎

$ python manage.py migrate products 

Django最后在它的新星版本(1.7卡塔尔国 将South整合进来并帮助迁移。

试行查询  

谢谢对象关系映射(object-relation mappingState of Qatar,你没有要求在此外框架中写风流罗曼蒂克行SQL语句。感激Ruby表明式,你可见非常高雅的写出范围搜索查询(range query卡塔尔国。.

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight) 

这会询问到前几日成立的Clients。Python不补助像1.day这种极端可读和洗练的语法,也不扶持..节制操作符。不过,有时在写Rails时自己备感像是又在写预注解(prepared statement)同样。举例为了筛选具有的某一字段大于某些值的行,你必须要像下边那样

Model.where('field >= ?', value) 

Django完毕的点子不是太好,但以自个儿的思想,却更是简要介绍。在Django对应的代码如下:

Model.objects.filter(field__gt=value) 

控制器(Controller)  

调控器的行事正是采纳央浼重临正确的答疑。网络应用程序标准专业是支撑增加,编辑,删除和突显具体的财富,而Ro奥迪Q3的简便表今后使开荒调控器的行事轻巧而近乎。调整器被拆分为多少个艺术(method卡塔尔,种种方法表示钦定的动作(action卡塔尔国(show代表哀告有些能源,new代表显示创立财富的表单,create代表从new接受POST的数目并确实的成立财富卡塔尔。调控器的实例变量(以@为前缀卡塔尔(قطر‎会活动被传送给视图(view卡塔尔(قطر‎,Rails从点子名称就能够识别应该把哪些模板(template卡塔尔国作为视图。

class ProductsController < ApplicationController    # 自动渲染views/products/show.html.erb    def show      # params是包含请求变量的ruby hash      # 实例变量会自动被传递给视图      @product = Product.find(params[:id])    end       # 返回空的product,渲染views/products/new.html.erb    def new     @product = Product.new   end       # 接收用户提交的POST数据。多数来至于在'new'视图中表单    def create      @product = Product.new(params[:product])      if @product.save        redirect_to @product     else       # 重写渲染create.html.erb的默认行为        render "new"     end    end  end 

Django使用三种不相同的章程实现调节器。你能够接受贰个形式来得以完成每一个动作,与Rails做法极其形似,恐怕您可感到各种调控器动作制造叁个类。 Django未有区分new和create方法,财富的开创和空财富的创始产生在同三个调节器中。也并未有便捷的主意命名你的视图。视图变量必要从调整器显式的传递,而利用的模板文件也亟需显式的装置。

# django通常称 'show' 方法为'detail' # product_id 参数由route传递过来  def detail(request, product_id):      p = Product.objects.get(pk=product_id) # pk 表示主键         # 使用传递的第三个参数作为内容渲染detail.html      return render(request, 'products/detail.html', {'product': p})     def create(request):      # 检查表单是否提交       if request.method == 'POST':          # 类似于RoR的 'create' 动作          form = ProductForm(request.POST) # 绑定于POST数据的表单          if form.is_valid(): # 所有的验证通过              new_product = form.save()              return HttpResponseRedirect(new_product.get_absolute_url())      else:          # 类似于RoR的 'new' 动作          form = ProductForm() # 空的表单         return render(request, 'products/create.html', { 'form': form }) 

在以上Django的事例中代码数量与Ro大切诺基相比很显明。Django好似也只顾到这么些难点,于是利用三翻五次和mixin开采出了第二种完成调整器的措施。第二种方法称为基于类的视图(class-based views卡塔尔 (注意, Django称那几个调整器为view卡塔尔国,而且在Django 1.5中引进以增长代码重用。比很多常用的动作都留存可被用来继续的类,比方对能源的显示,列表,创制和更新等,那大大简化了代码开荒。重复的干活比方内定将被使用的视图文件名称,获取对象并向view传递该目标等职业也会被自动实现。上边同样的事例使用这种艺术独有四行代码。

# 假设route传递了名为 'pk' 的参数,包含对象的 id 并使用该id获得对象。  # 自动渲染视图 /products/product_detail.html  # 并将product作为上下文(context)变量传递给该视图  class ProductDetail(DetailView):      model = Product     # 为给定的模型生成表单。如果得到POST数据  # 自动验证表单并创建资源。  # 自动渲染视图 /products/product_create.html  # 并将表单作为上下文变量传递给视图  class ProductCreate(CreateView):      model = Product 

当调节器比较轻易时,使用基于类的视图(class-based viewsState of Qatar经常是最棒的挑精拣肥,因为代码会变得井井有条,具有可读性。不过,决定于你的调节器的不标准(non-standard卡塔尔国程度,只怕会须求重写过多函数来得到想要的效果与利益。常遭遇的情状正是技术员想向视图传递更加多的变量,此时能够重写get_context_data函数来变成。你是或不是想规行矩步目前指标(模型实例卡塔尔的特定的字段来渲染差别的模版?你一定要重写render_to_response函数。你想不想改动得到对象的方法(暗中认可是选拔主键字段pkState of Qatar?你只好重写get_object。举个例子,假使大家想要通过产物名称选用产品并非id,也要把看似的出品传递给大家的视图,代码就有不小希望像这么:

class ProductDetail(DetailView):      model = Product         def get_object(self, queryset=None):          return get_object_or_404(Product, key=self.kwargs.get('name'))         def get_context_data(self, **kwargs):          # 先调用基类函数获取上下文          context = super(ProductDetail, self).get_context_data(**kwargs)             # 在相关产品(product)中添加          context['related_products'] = self.get_object().related_products          return context 

视图  

Rails 视图使用 内置的Ruby 模板系统,它能够让你在你的沙盘里面编写大肆的Ruby代码. 那就象征它可怜有力和高速, 而特别强盛的还要就意味着十分大的义务. 你只可以特别小心的不去把展现层同任何别的品类的逻辑混在一齐. 这里本人急需再行提到关系一人学子的例子. 壹个人新校友参与了咱们的Ro凯雷德项目,何况在上学大器晚成项新特色. 代码考察的时间到了. 我们首先从调节器开头,第生龙活虎件令笔者吃惊的专业是她写的调控器里面代码超少. 小编转而急迅去探视她写的视图,看见了大块混着HTML的ruby代码. 诚然,Rails并不会嫌弃紧缺资历的程序猿,但本身的观点是框架能够帮助开辟者幸免有些坏的实施. 举个例子 Django 就有叁个百般轻便的 模板语言. 你能够拓宽if判别以致经过for循环进行迭代,不过从未主意接纳未有从调控器传入的对象,因为它并不会实施任性的Python表明式. 那是三个本身感觉能够促使开辟者方向正确的规划决定. 那能让大家项目中的生手找到组织他们代码的不易方式.

资源: CSS, Javascript 以及 图片

Rails 有一个很科学的嵌入 能源管道. Rails 的能源管器材备对JavaScript和CSS文件进行串联、最小化和压缩的本事. 不仅如此,它也还协理诸如 Coffeescript, Sass 和 ERB 等其余语言. Django 对能源的扶持同Rails相比就显得水火不相容了,它把要麻烦都丢给了开采者去管理. Django 唯大器晚成提供的就是所谓的 静态文件, 那基本上就只是从各类应用程序这里将兼具的静态文件集合到八个地点. 有三个名字为 django_compressor 的第三方app提供了后生可畏种恍若于Rails的能源管道的解决方案.

单(Forms)

互联网采取中的表单是客商输入(input卡塔尔的界面。在Rails中的表单包蕴在视图中一向利用的帮手方法(method卡塔尔。

<%= form_tag("/contact", method: "post") do %>    <%= label_tag(:subject, "Subject:") %>    <%= text_field_tag(:subject) %>    <%= label_tag(:message, "Message:") %>    <%= text_field_tag(:message) %>    <%= label_tag(:subject, "Sender:") %>    <%= text_field_tag(:sender) %>    <%= label_tag(:subject, "CC myself:") %>    <%= check_box_tag(:sender) %>    <%= submit_tag("Search") %>   <% end %> 

像subject,message这样的输入字段能够在调控器中通过ruby哈希 (雷同辞书的布局卡塔尔国params来读取,比方params[:subject]和params[:message]。Django通过另风姿罗曼蒂克种方法抽象了表单概念。表单封装了字段并带有验证准绳。它们看起来疑似模型。

class ContactForm(forms.Form):      subject = forms.CharField(max_length=100)      message = forms.CharField()      sender = forms.EmailField()      cc_myself = forms.BooleanField(required=False) 

Django会将CharField剖判为对应HTML成分的文本输入框,将BooleanField剖析为单选框。你能够坚守本身的素愿使用 widget 字段退换为其它输入元素。Django的表单会在调控器中实例化。

def contact(request):      if request.method == 'POST':          form = ContactForm(request.POST)          if form.is_valid():              return HttpResponseRedirect('/thanks/') # POST之后重定向      else:          form = ContactForm() # An unbound form         return render(request, 'contact.html', { 'form': form }) 

Django会自动抬高验证音信。暗中认可景况下具有的字段都是必得的,除非特别定义(比方cc_myself卡塔尔(قطر‎。使用方面包车型大巴代码片段,固然表单验证失败,带有错误音讯的表单会活动重新展现,已经输入的颠末也博览会示。下边包车型地铁代码在视图中显示彰显了二个表单。

<form action="/contact/" method="post">   {{ form.as_p }} <!-- 生成类似于rails的表单 -->  <input type="submit" value="Submit" />  </form> 

URL 和 Route

Route 是将一定的UENVISIONL相配到内定调节器的行事。Rails构造建设REST网络服务极其轻便,而route以HTTP的一言一行(verbs卡塔尔(قطر‎来公布。

get '/products/:id', to: 'products#show' 

如上的例子展现,向/products/any_id发起的GET须求会自动route到products调控器和show动作(action卡塔尔(قطر‎。感激惯例优先原则(convention-over-configuration卡塔尔(قطر‎,对于创立包罗全数动作(create,show,index等等State of Qatar的调整器的这种布满职责,Ro福特Explorer构造建设了后生可畏种高效申明全数常用route的措施,叫做resources。假诺您依据Rails的老规矩(convention卡塔尔(قطر‎命名了调节器的不二秘技时那会很有益于。

# automatically maps GET /products/:id to products#show  #                    GET /products to products#index  #                    POST /products to products#create  #                    DELETE /products/:id to products#destroy  #                    etc.  resources :products 

Django不是通过HTTP的作为来调控route。而是使用更目不暇接的运用正则表明式来相称U兰德TiggoL和相应的调控器。

urlpatterns = patterns('',      # 在products控制器中匹配具体方法      url(r'^products/(?Pd+)/$', products.views.DetailView.as_view(), name='detail'),      # 匹配index方法就获得了主页      url(r'^products/$', products.views.IndexView.as_view(), name='index'),      url(r'^products/create/$', products.views.CreateView.as_view(), name='create'),      url(r'^products/(?Pd+)/delete/$', products.views.DeleteView.as_view(), name='delete'),  ) 

是因为采用了正则表明式,框架会自行使用单纯的证实。要求/products/test/会因相称不到其余route而回到404,因为test不是未可厚非的数字。分化的法学观念在这里边又一遍面世。Django在命名调控器动作方面真正有支持一些,以致于Django就未有像Rails的resource那样方便的副手,並且每种route必得显式的概念。那将招致各样调节器须要多少个route准绳。

测试

在Rails中测量检验比较轻易,与Django相比起来更亟待器重重申。

Fixture

八个框架以平日的点子都扶植fixture示例数据)。笔者却给Rails更加高的评说,因为它更实用,能从文件的名号得到消息你在接收哪个模板。Rails使用YAML格式的fixture,那是全人类可读的多寡体系化格式。

# users.yml (Rails当前知道我们在使用user的fixtures)  john:    name: John Smith    birthday: 1989-04-17   profession: Blacksmith     bob:    name: Bob Costa    birthday: 1973-08-10   profession: Surfer 

装有的fixture会自动加载并且在测量检验中得以作为本地变量来做客。

users(:john).name # John Smith 

Django也支撑YAML格式的fixture可是开采人士更赞成于选拔JSON格式。

[    {      "model": "auth.user",      "fields": {        "name": "John Smith",        "birthday": "1989-04-17",        "profession": "Blacksmith",      }    },    {      "model": "auth.user",      "fields": {        "name": "Bob Costa",        "birthday": "1973-08-10",        "profession": "Surfer",      }    }  ] 

那没怎么吸重力,注意它有多啰嗦,因为你必需显式的定义它归属哪个模板,然后在 fields下边列出每个字段。


图片 1


难以取舍的公允(1卡塔尔(قطر‎作者想以三个豁免权利注脚来初步上边包车型大巴内容。笔者使用Django开垦网址已经有四年了,家弦户诵,小编喜...

本文由js06金沙官网登录-js06.com-欢迎您发布于计算机,转载请注明出处:Rails和Django的深度技术对比 难以取舍的公正(1)

关键词: