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

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 也很糟糕,一吐槽都停不下来,哪里哪里都很糟糕

wander639:view 的话可以考虑下 cbv
模板的话不知道能不能自己换成 mako
个人觉得 django 的 orm 还是挺好用的

Rxianbei:啊,对呀,要在 view 层定义请求方式实在是把我看得一愣一愣,这也太不优雅了。

cyssxt:熟能生巧

youngce:1. obj.__len__()是 len(obj)面向对象的写法,不主动定义为 obj.len ()是考虑到很多人也需要对这种东西自定义
2.django 是你的理解还不够的,你列举的那些问题,django 都有完善的高级的处理办法,但是你如果只看了了一个入门教程,可能是还没接触到这些。django 属于那种需要一段时间上手的框架,不要指望一上手就掌握所有 django 特性,如果没有耐心,请使用 flask 。

youngce:CVB 是不要整这些 view 层定义的,路由也是完全的 rest 风格,正经写 api,也都用 drf 的,不要被一些水货教程误导了

subpo:@youngce #5 rest framework 有在用,我也想吐槽来着,serializer 就我个人的感觉,一般是格式化输出的东西,但是 rest framework 把 serializer 同时作用于参数输入,验证,存储和格式化输出,一些常用的功能(自定义输入验证,输出附上一些自定义字段)也没能简单的提供,都需要进行一些有些奇怪的操作。

不过有你这么说我就放心多了...较长时间里不得不接触 Django 的话,宁愿是我自己菜

Philippa:Django 起手挺复杂的,而且设计得很繁杂,很多魔法,我一开始也很难适应。我后来找到一个入门 tutorial 去写个小 demo 才慢慢入门。

一般使用 rest_framework + Django + 一点最佳实践。用 ModelView 和 Model Serializer 那种高度抽象得语法来写,开发速度非常非常快的,而且它生态很好,除了基础功能,连 aws 等平台绑定的 libaries 也一大堆,如果你想最大化自己的开发速度,Django 一定是 Python 最好的选择,即使和其他语言的 Web 比较如 PHP 和 Ruby 也毫不逊色。

我用 Django 写 web 大部分时间其实都是遵照 TDD 写 unittest 的,因为一般常见的 API 开发,写 view/model/serializer 等都没多少行代码,大部分代码都是 unittest 。但这种高度抽象的写法很容易出错,多一行,少一个方法可能相差非常大,不写 unittest 来 debug 是非常困难的。

建议多花一周实践继续研究一下,我当时刚开始也觉得很痛苦= =,怎么设计那么脏,为什么要用字符串而不是类,为什么要去 override 那么多方法来实现 api 等等,中途还一度放弃去写 flask/echo,但最终尝试下来发现这值得,开发效率非常非常高,现在我个人开发都是 Django + React 。个人的 Nodejs 的 Nestjs 还是 Expressjs 的开发效率和 Django 还是差一个等级。

subpo:@subpo #6 我表达的不是很清楚。重新说一下

比方说一个 api 的 create 部分的常见操作:
1. 验证传输进来的数据的合法性,包括数据格式转换,验证等
2. 进行一些业务逻辑后存入数据库
3. 返回存入的字段和一些自定义字段

这个常见的操作用 drf 怎么都走不顺。操作 1 的 serializer,操作 2 的 model,操作 3 的返回 serializer 几乎是同一样东西,但是又有一些细节不同,实现起来很别扭,不顺。

并且个人认为 djr 的 Restful 设计的不太好,诚然做一个标准的 CURD 操作用 Viewset 非常方便用不了几行代码,但是真正放到业务逻辑里,又有多少标准又无扩展逻辑的 CURD 呢?这时,djr 需要用不同于 Viewset 的另外一套逻辑来处理这部分业务逻辑,显得非常脆弱。

把 Python web 当 PHP web 写

abersheeran:https://github.com/Aber-s-practice/fake-php 随手建了一个项目玩玩,仅供娱乐。如果你喜欢 .py 的后缀,把 .php 改成 .py 就行了。 哈哈哈,有时候这种设计之外的用法还是蛮有意思的。

用 SSH 内网穿透搭建 web 网站,如何避免静态文件被运营商缓存?

laojifuli:大佬们好,我是新来的 我有一台服务器 A,内网有 ubuntu 虚拟机 B,A 跟 B 都安装了带宝塔的 lnmp 环境 我将域名 abc.com 解析到服务器 A,然后在机器 B 上用 SSH 命令配合服务器 A 上的 nginx 反向代理,实现了可以将 abc.com 的内容放在机器 B 上并能外网访问,在服务器 A 上安装域名 ab…

微博 web 端登不上去了

nockyQ:群聊里有朋友说微博 web 端登不上去。用 ping.chinaz.com 测了一下,发现湖北地区响应 IP 都是 127.0.0.1 。有人知道这是什么原因导致的吗?duanzhihe:可能是电缆被挖断了吧 Jevan:我也是,不过前面加 WWW 就可以了。 easonHHH:微博上面说的是运营商故意的 Jevan:#3 应该不是,这几天上微…

web 开发可不可以像集装箱一样组装起来?

milu2003516968:最近想做一款产品,搭建官网,然后我感觉有很多重复性的工作。比如我希望为网站增加一个问答系统,又比如我希望为网站增加一个文章系统,又比如我要开发网站的账号系统,注册+登录+手机验证+邮箱发送验证+找回密码等等。搭建完之后,我还要搭建产品的文档和帮助中心等等。其实这些东西,你做下一款产品的时候,这种工作依然是重复的。我也在想,这世界…

写了一个 Web 端的网易云音乐的同步听歌

Dounx:算是一个玩具应用,主要练手了下最近学的东西,没什么技术含量(Demo: https://music.dounx.me (用 yJkFxBajNCHPU5GfakJxc675 可以加入我的房间)项目地址: https://github.com/Dounx/live-music网易云账号登陆的时候,数据不会保存在服务器端,只是通过 https 在服务…