用 Django 写 web 写的无比痛苦,是我的问题吗?

2020-09-21 22:38:07 +08:00
 subpo
最近从 Ruby on Rails 切换到 Python on Django 。才上手写了几天,可能对 Django 理解不深刻,但是这几天真的把我恶心的想吐,这是我的问题吗?还是继续写下去就能发现这个将近 20 年的框架的优秀点?

Python 虽然对我来说还有一点点小别扭的地方(比如明明是一切皆对象,却使用 len(obj)而不是 obj.len()),总体来说写起来还是比较爽,语法比较简单,调试工具链完善,网上能找到的资料也多。

但是 Django 简直让我痛苦无比。

按照官方文档,router 层无法定义请求类型,要在 ViewController 里面写 if request.method == "POST" 。
畸形的模板系统,无法在模板层写脚本,这点我可以理解是架构的设计考虑到不想在模板层引入逻辑,但放着 python 这么有表现力的语言不用,硬是发明了一个新的模板语法,实在是理解不能。

细节的问题更加数不胜数
比如写一些复杂的 View,需要把同一个资源的 POST 和 GET 方法拆开写
post /api/resources create_resource_view
get /api/resources list_resource_view
居然发现 Django 的 router 不支持把这种约定俗成的 RESTful api 导向不同的文件

模板层也各种难受,API 接受到 string 格式的 date 参数,需要转成 date 格式存入数据库,这么一个任何一个 APP 都会遇到无数次的逻辑,都需要 hard coding 或三行以上的代码来处理

API 参数验证也很糟糕,ORM 也很糟糕,一吐槽都停不下来,哪里哪里都很糟糕
4415 次点击
所在节点    问与答
30 条回复
BenX
2020-09-22 08:38:00 +08:00
一切原因在于你从 ror 转出来的,被 ror 伺候过,其它都不香了。
wangkun025
2020-09-22 08:44:18 +08:00
被 rails 惯坏了。
最近看 spring boot,连 router 都没有。直接在 controller 里写 mapping,岂不是更加郁闷。
Jammar
2020-09-22 08:49:46 +08:00
用 drf
router 直接指向函数或者类(实现 as_view()方法的)
view 层定义 method,有很多种放我,我常用在类下面 def get
string 转 date,我没记错的话可以直接序列化,或者使用一些模块一行代码的事情,比如 datetime
api 参数验证直接使用 serializer.is_valid()没有报错.data 获取数据
orm 是面向对象的形式 user=User(),user.name=xxx,user.sava()
对于一个常见的 create 操作,先写 modelserializer,再视图层验证取数据,可以看一下 drf 的 CreateAPIView
Akkuman
2020-09-22 09:09:20 +08:00
把 drf 的文档看完,然后边做边看源码,其实你会发现各个地方都有钩子,可控性挺强的
37Y37
2020-09-22 09:26:12 +08:00
我不管,反正我用起来贼香,哈哈
nonduality
2020-09-22 09:33:31 +08:00
说起来,你的抱怨来自两点:1 、缺少开放思维,带着 ROR 的固有习惯,认为 ROR 的做法才是唯一正确; 2 、对 Django 学艺不精,Django 作为广泛使用的框架,如果大家都是像你那样在忍受各种缺陷,是不可能走到现在的。

我从来不喜欢基于函数来处理请求,喜欢用 class-based view,宁可直接继承 GenericView 来写,同一个类下定义一个 get 和一个 post 方法,然后 as_view()绑定到同一个 url,根本不会有你说的问题。

至于模板,属于见仁见智,如果允许模板写很多代码,那就违背了逻辑和表现分离的原则,鼓励用户将更多的逻辑扔到模板里。

API 的问题,用 DRF 。

Django ORM 我认为很好很优雅,尽管我也可以接受 SqlAlchemy 的形式( Flask 用的是修改过的,要不更难用),但像 Pony 之类搞的黑魔法,lambda 满天飞,才叫糟糕。
libracloud
2020-09-22 10:06:40 +08:00
用 rails 后,用啥都不爽
linvaux
2020-09-22 10:09:29 +08:00
用 fastapi
Mark24
2020-09-22 10:11:19 +08:00
体验过 rails,我选 Ruby On Rails

Python 确实优秀

但是 Ruby 似乎更胜一筹~
xulolololololo
2020-09-22 12:53:39 +08:00
我以前也是用 django 的,但是我们都是自己定制化自己公司的业务 view,所以不涉及 django 太多奇奇怪怪的东西。然后新公司换成 sanic,也是定制了一下就写了,这 web 开发就是这么回事,框架随便换。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/709193

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX