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
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
edutilos
V2EX  ›  Python

django 新手,求助一个 request 参数传递的问题

  •  
  •   edutilos · 2016-03-21 09:22:46 +08:00 · 3424 次点击
    这是一个创建于 3204 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第一次发帖,比较菜,描述可能比较啰嗦,请多包涵

    事情是这样的,现在在用 CAS 做一个单点登陆系统

    用的是 django 的几个库( django-cas-ng , django-mama-cas , django-python3-ldap , django-ldapdb )

    目前是用一个 django 应用做 CAS SERVER ,然后其他的应用对用户进行的所有操作(登陆注册修改信息等)都会跳转到 cas server 进行,然后再跳转回去

    然后目前遇到这样一个问题,比如给一个手机注册的用户,绑定邮箱,逻辑如下:
    1. 用户访问 app1.com ,点击绑定邮箱
    2. 用户名和 app1 的 url 作为参数,跳转到 server.com/bind_mail/?username=XXX&?url=app1.com
    3. 然后问题就出在这儿了, cas server 端的 view 函数需要从 request.GET 里得到 username 和 url 参数,然后在表单提交后的, request.POST 里根据对用户进行修改,代码如下:



    然后发现 view 里一开始用 request.GET 取到的参数,到表单提交后(if request.POST 之后)就没有了,用了 deepcopy 也保存不了

    然后用了个特别笨的方法,在<input type='submit'>里加了个 name="{{ request.GET.url }}#{{ request.GET.username }}",然后在 request.POST 后是能拿到 url 和 username 了,修改跳转都正常。

    然而这种方法,一旦表单验证失败, url 里的关键字参数就会消失,就无法完成修改了

    搜索了半天,没有合适的方法,有个很久前的文章( https://timmyomahony.com/blog/djangos-request-updating-with-request-get/)说用 request.REQUEST.get 能得到 old value ,然而试了并没有用,新版 django 文档里也没有相关资料

    所以在这里求助,有什么好的解决方案吗?还是我的整个思路就有问题?
    7 条回复    2016-03-21 20:18:13 +08:00
    virusdefender
        1
    virusdefender  
       2016-03-21 09:36:21 +08:00
    到表单提交后(if request.POST 之后)就没有了,用了 deepcopy 也保存不了
    --------------

    怎么可能会没有了?什么表现让让你认为没有了
    edutilos
        2
    edutilos  
    OP
       2016-03-21 09:43:09 +08:00 via Android
    @virusdefender 取不到值了, print 出来是空的
    cloverstd
        3
    cloverstd  
       2016-03-21 09:46:27 +08:00
    GET 方法种获取到的 username 和 url 在 render 的时候作为参数参入,写进 input[type=hidden] 里面
    wangyongbo
        4
    wangyongbo  
       2016-03-21 09:59:29 +08:00   ❤️ 1
    GET server.com/bind_mail/?username=XXX&?url=app1.com
    之后的 POST 是不是到 server.com/bind_mail/
    你把 form 的 action 改为 '', 应该还能用 request.GET 获取到 username 和 url 。

    有个问题是,你这样不做任何验证的话,岂不是 username 随便写,就把别人的邮箱改了?

    HTTP 是无状态的。 不同请求要共享数据,要找个地方存,可以放在 cookie 或者 session.
    edutilos
        5
    edutilos  
    OP
       2016-03-21 10:12:07 +08:00
    @wangyongbo 感谢,改了 action 确实搞定了,而且还发现了新问题
    wind3110991
        6
    wind3110991  
       2016-03-21 16:30:29 +08:00
    你的 django 是哪个版本的?
    edutilos
        7
    edutilos  
    OP
       2016-03-21 20:18:13 +08:00
    @wind3110991 1.8 、 1.9
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:46 · PVG 02:46 · LAX 10:46 · JFK 13:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.