使用 Django 搭建 APP 服务端的一系列问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv/a>
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
piaochen

使用 Django 搭建 APP 服务端的一系列问题

  •  
  •   piaochen 2017 年 7 月 17 日 4092 次点击
    这是一个创建于 3202 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Django 刚入门,打算使用 Django 搭建 APP 的服务端。APP 类型类似于团购外卖这种。有几个问题,困惑了好久。希望这方面有经验的,能给一些指导。谢谢了。
    1.是否需要使用 django rest framework 这种框架?我也花时间看了 django-rest-framework,不过根据我的理解,这种框架直接增删改查数据还是挺方便的,但是一旦涉及到一些逻辑处理,是不是不大适合?例如一个订单,可能涉及多张表查询汇总,修改字段状态什么的。我自己感觉还是使用原先 Django 的 View 层中 get、post 方法处理比较方便。
    2.假如不使用 rest framework,我自己在 view 的 get,post 方法中形成 json 数据返回给客户端。那么 django 中 form 提交所涉及的 csrf 的机制是不是就要废弃掉了?自己和客户端商量安全的机制?
    3.这方面有没有什么开源的项目或者代码能参考的,假如有,麻烦告知下。谢谢各位。
    14 条回复    2017-07-18 21:49:30 +08:00
    neoblackcap
        1
    neoblackcap  
       2017 年 7 月 17 日
    一听就是坏习惯,View 就是表现层,我觉得他们做数据校验都算多了。你还要将业务逻辑写在里面。你应该封装一个 Service 类,这样你不管换什么 View 都能很好地复用。
    项目的话应该参考 sentry 就差不多了吧
    zonghua
        2
    zonghua  
       2017 年 7 月 17 日 via iPhone
    @neoblackcap 数据校验在 serializer,如果都封装一个 service 类,传参数都够烦人了。
    wph95
        3
    wph95  
       2017 年 7 月 17 日
    > 这方面有没有什么开源的项目或者代码能参考的
    https://github.com/taigaio/taiga-back
    lolizeppelin
        4
    lolizeppelin  
       2017 年 7 月 17 日 via Android
    有啊 openstack
    qq12345454
        5
    qq12345454  
    nbsp;  2017 年 7 月 17 日
    @neoblackcap
    @zonghua

    drf 默认不是校验了数据吗? 你们还校验什么场景下的数据?
    lumonix
        6
    lumonix  
       2017 年 7 月 17 日 via iPhone
    @neoblackcap django 不算是一个标准的 MVC 构架,它的 views 文件相当于其他框架的 controller,并不是表现层
    virusdefender
        7
    virusdefender  
       2017 年 7 月 17 日 via iPhone
    1 是的 2 不是

    明天电脑具体说
    neoblackcap
        8
    neoblackcap  
       2017 年 7 月 18 日
    我来一一回答
    @zonghua 先看楼主的说法,他可不仅要将数据校验放 view,他是想要将一部分业务逻辑也放这里,这个才是我要否定的。所有东西都放第一个地方,重构火葬场

    @qq12345454 drf 默认校验了一部分数据,不过只是我觉得它实现的跟我想要的不一样,我更倾向于在类似中间件之类的部件做完这些。将所谓的校验逻辑从 view 里面脱离出来,可能更倾向于 view->validation->model/bussiness

    @timle1029 嗯 Django 不是一个 MVC 框架,我认同,但是哪怕 MVC 也好,MVT 也好,Controller 对应的部分也不应该写业务逻辑,这个没毛病吧,Controller 应该是传递对应的参数给 Model 层,让 Model 层对应的模块去处理业务逻辑。此处我会将数据校验也当作一部分业务逻辑,这才是我认为 drf 的数据校验放在 view 不符合我个人的地方
    piaochen
        9
    piaochen  
    OP
       2017 年 7 月 18 日
    @neoblackcap 感谢您的回答,不过我问题其实是关于 django-rest-framework 是否是用便捷程度的问题,我目前对 restful 风格还是有些陌生,不知道逻辑处理怎么在 rest 框架中体现,想直接用 django 返回 json 数据,但是看到大家都在推荐 rest 写 api 接口,所以比较困惑。
    piaochen
        10
    piaochen  
    OP
       2017 年 7 月 18 日
    @virusdefender 烦请详述
    neoblackcap
        11
    neoblackcap  
       2017 年 7 月 18 日
    @piaochen 平心而论,drf 还是蛮便捷的。一般接口直接 Model, ModelSerializer, ModelViewSet 三连就好了,当然你有特殊校验就得你自己写 Serializer 来校验了,跟数据库相关的需要在业务层进行校验。
    piaochen
        12
    piaochen  
    OP
       2017 年 7 月 18 日
    @neoblackcap 我看的材料,都是 ModelSerializer 对 Model 进行序列化,然后 ModelViewSet 中,通过 queryset 和 serializer 来返回数据。例如:
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    给我的感觉是一个 ModelViewSet 只对应一个 Model,把干这个 Model 序列化后返回给客户端就完事了。
    但是一般的 APP 接口逻辑不可能只是获得这样的模型对象的,例如登录,我要从客户端传入 username 和 pwd,进行验证,可能还要查询、设置其他表一些标志位,形成 user 的数据,返回给客户端。这样的逻辑处理,和涉及好几个表之间的操作,在 django rest framework 中,怎么操作呢?
    neoblackcap
        13
    neoblackcap  
       2017 年 7 月 18 日
    @piaochen 他们提供 perform_create 这样的钩子,你重写这个钩子就好了,update, delete 的都有,具体请看文档
    virusdefender
        14
    virusdefender  
       2017 年 7 月 18 日
    DRF 库提供了很多我并不会用到的功能,比如登录验证,权限管理,API 版本号管理,限流、自动翻页等等,这些我更侧重独立和手动的处理。

    Generic Views 一直是一个让我感到疑惑的东西,看似写起来简单,代码量很少,像是填充一些预定义的变量和方法,简单的增删查改会方便一点,但是在实际复杂的业务场景下,可能导致问题复杂化,并没有显式的写出操作过程更清晰。
    所以我仿照 DRF 的 APIView,继承 Django 的 View,自己写了一个新的 APIView,包含了核心功能,解析 JSON,同时增加了部分常用方法,比如 validate_serializer、self.success、self.error 和 self.paginate 等等。

    大致的代码就是

    class UserProfileAPI(APIView):
    @validate_serializer(ChangeUserProfileSeralizer)
    def put(self):
    ....
    if err:
    return self.error("保存失败")
    return self.success(UserProfileSerailzier(user_profile).data)

    class ProblemAPI(APIView):
    def get(self):
    return self.success(self.paginate(request, Problem.objects.all(), ProblemSerializer)))

    CSRF 和 DRF 没关系,是 Django 的验证,token 也可以在 HTTP 头中传递
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3710 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 04:27 PVG 12:27 LAX 21:27 JFK 00:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86