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

python还未入门,求教一个python的问题

  •  
  •   iiduce · 2010-09-03 08:46:51 +08:00 · 11179 次点击
    这是一个创建于 5223 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前一直用C#,.net,最近转学python。昨晚写程序的时候遇到个问题不知怎么实现,向大家求教。

    在.net(或VB)之类,都可以在页面中定义一个按钮,然后给按钮的click绑定服务器端事件。在python中应该怎样做类似的实现?

    谢谢啦。
    58 条回复    1970-01-01 08:00:00 +08:00
    billychow
        1
    billychow  
       2010-09-03 09:21:01 +08:00
    又一个被 WebForm 毒害的...
    makestory
        2
    makestory  
       2010-09-03 10:56:42 +08:00
    不太清楚.net,VB。

    不管怎样,你需要让点击这个按钮后会发起一次请求,写代码让服务器端响应这个请求做点什么事情。

    具体讲可能这个按钮是个表单提交,或者触发一个ajax事件,服务起端可能是保存表单数据,或者返回搜索结果等等。建议你看一些web开发框架的文档,表单部分或ajax部分。
    yuest
        3
    yuest  
       2010-09-03 10:57:27 +08:00
    先确定一个框架,然后读它官方的 Tuturial 或者公认的入门好书。
    iiduce
        4
    iiduce  
    OP
       2010-09-03 11:01:51 +08:00
    @makestory

    使用ajax的方式我倒是会。 但是我不希望通过ajax调用接口,因为我不想别人通过fiddler之类的工具看到我的接口。
    在.net中,我使用按钮触发服务器端事件,在服务器端使用WebRequest去请求,能够隐藏我调用的接口。
    iiduce
        5
    iiduce  
    OP
       2010-09-03 11:03:59 +08:00
    @yuest
    我学习的框架是django,书看了两本了。没找到怎么解决这个问题的方法。maybe,偶愚笨。。

    django中用的静态模板,怎么触发view里的方法呢。。
    ong
        6
    ong  
       2010-09-03 11:13:12 +08:00
    建议你花一周学下.net的MVC框架,然后来做python。
    很多人VS拖拉了一俩年都不知道B/S的原理。
    ccdjh
        7
    ccdjh  
       2010-09-03 11:19:57 +08:00
    你是混淆了概念了吧?表单传递可以用post和get.
    你的什么按钮触发服务器端事件。。是用在GUI上吧?例如使用Tkinter

    import Tkinter import *

    def xxxx()
    pass

    quit = Botton(command=xxxx)
    iiduce
        8
    iiduce  
    OP
       2010-09-03 11:20:48 +08:00
    @ong
    B/S原理跟这个有啥关系,我确实菜鸟。大大,给点提示好么。
    iiduce
        9
    iiduce  
    OP
       2010-09-03 11:22:16 +08:00
    @ccdjh
    不是在GUI中,是在网页中的按钮。

    表单的post,get方法还是要暴漏http api和需要接收的参数名称。
    sjIwBjkW8fgByvSO
        10
    sjIwBjkW8fgByvSO  
       2010-09-03 11:24:41 +08:00
    又一个被 WebForm 毒害的...
    ____________________________
    +10086
    sjIwBjkW8fgByvSO
        11
    sjIwBjkW8fgByvSO  
       2010-09-03 11:26:40 +08:00
    django中没有 类似。NET控件这类东西,那是.NET独有的方式。

    实现这个你要做的是在HTML中自己编写。
    iiduce
        12
    iiduce  
    OP
       2010-09-03 12:10:28 +08:00
    @jacy_hao
    在html中怎么编写?能不能给一点点提示?
    est
        13
    est  
       2010-09-03 12:23:34 +08:00
    vs害人不浅啊不接啊。。。
    iiduce
        14
    iiduce  
    OP
       2010-09-03 12:51:22 +08:00
    @est
    你们都在说winform、vs害人不浅,倒是说说怎么实现相同的操作啊。

    你们可能认为事件绑定就是.net控件特有的,但我认为在其他语言中,可能不叫绑定,但应该有相同的实现吧。

    或者说 我希望让页面中的某个元素触发一个事件,这个事件是去调用一个http接口(可以get或put的url),但是我不想让别人知道这个http接口,在python中如何实现呢?
    iiduce
        15
    iiduce  
    OP
       2010-09-03 13:01:23 +08:00
    或者举个具体的例子:

    假设以get方式访问http://www.abc.com?code=1 ,可以返回一个json格式的数据。

    我要在页面中实现用户点击一个按钮后,程序访问http://www.abc.com?code=1获得返回的json数据,用于在页面中显示。 在这个过程中,我不想用户知道数据是我访问了http://www.abc.com?code=1后获取的。

    在python中如何实现?
    yiyang
        16
    yiyang  
       2010-09-03 13:26:16 +08:00
    @iiduce 不要在这里问问题拉浪费时间,其实VS这种方式也很好阿,开发效率也高。越简单越好,不要以为你们知道原理一个个的写就牛必了。关键是怎么最快出好用的产品赚钱啦
    iiduce
        17
    iiduce  
    OP
       2010-09-03 13:32:15 +08:00
    @yiyang

    看样没人回了,我找个python论坛问问去。
    flytwokites
        18
    flytwokites  
       2010-09-03 14:05:34 +08:00
    这个问题已经不是python的问题了。
    另外我很好奇你为什么不想要用户知道访问什么url得到数据?
    Paranoid
        19
    Paranoid  
       2010-09-03 15:20:51 +08:00
    难道我out了?

    我都是这么写滴.
    //include jquery js first
    <script type="text/javscript">
    $(document).ready(function(){
    $('#btn_id').click(function(){
    $.ajax({
    type: 'get',
    cache: false,
    url: 'http://www.abc.com?code=1',
    success: function(html){
    // like this.
    $('#update_ele_id').html(html);
    }
    //...
    });
    });
    });
    </script>
    huacnlee
        20
    huacnlee  
       2010-09-03 16:33:02 +08:00
    @iiduce 推荐看看 Ruby on Rails http://guides.rubyonrails.org
    iiduce
        21
    iiduce  
    OP
       2010-09-03 16:53:36 +08:00
    rveo
        22
    rveo  
       2010-09-03 19:57:43 +08:00
    @iiduce 这位兄弟,我以 9 年的网站技术经验告诉你:在 website 里不让人知道是不可能的。
    Paranoid
        23
    Paranoid  
       2010-09-03 20:15:35 +08:00
    @iiduce 不让用户知道,如何让服务器知道呢? ( 没.net(或VB)经验,确实不大理解你的那个想法,噶)
    est
        24
    est  
       2010-09-03 20:24:13 +08:00
    @rveo .NET就是这样封装的。。。他们以为一个 runat='server' 客户端就看不到了。。。哈哈。。。逻辑都混杂写服务器了。
    zaykl
        25
    zaykl  
       2010-09-03 20:49:48 +08:00
    杯具的事情总算再次遇到,同情楼主...你是自学编程的吧?
    zaykl
        26
    zaykl  
       2010-09-03 21:00:11 +08:00
    曾经被人如此问倒...楼主加油.

    VB真的害人不浅...

    我还是为下一代着想 给出答案吧:
    http://www.djangoproject.com/documentation/0.95/request_response/
    chuangbo
        27
    chuangbo  
       2010-09-03 22:09:09 +08:00
    强烈同情这些被M$毒害、对运行机理一窍不通的孩子。特别是在V2EX的地方看到他们。
    楼主的问题和 python 与否没有一点关系。还是回去鼠标拖控件吧。
    zaykl
        28
    zaykl  
       2010-09-03 23:01:24 +08:00
    其实 我是明白了 楼主的意思....


    汗...
    iiduce
        29
    iiduce  
    OP
       2010-09-03 23:22:19 +08:00
    oh 我来了。 好热闹,很高兴看到有这么多人讨论。
    iiduce
        30
    iiduce  
    OP
       2010-09-03 23:25:49 +08:00
    几位朋友如是说:
    rveo @iiduce 这位兄弟,我以 9 年的网站技术经验告诉你:在 website 里不让人知道是不可能的。

    Paranoid @iiduce 不让用户知道,如何让服务器知道呢? ( 没.net(或VB)经验,确实不大理解你的那个想法,噶)

    est @rveo .NET就是这样封装的。。。他们以为一个 runat='server' 客户端就看不到了。。。哈哈。。。逻辑都混杂写服务器了。


    好吧,我用.net写了一个页面http://168.160.185.111:9999/test.aspx

    点击页面中的按钮,页面会请求一个http url接口获取数据,并显示在页面上。

    烦请告诉我,我请求的http url是什么,您是如何知道的。 感激不尽。
    iiduce
        31
    iiduce  
    OP
       2010-09-03 23:27:30 +08:00
    @zaykl
    差不多算是自学的吧,不过也工作好几年了,产品项目也一直在做,不过可能都流于皮毛了。
    iiduce
        32
    iiduce  
    OP
       2010-09-03 23:29:04 +08:00
    @zaykl

    http://www.djangoproject.com/documentation/0.95/request_response/ 您给的这个页面里面的内容以前看过,又看了一遍。没有发现如何解决。能给一点小小的提示么。
    iiduce
        33
    iiduce  
    OP
       2010-09-03 23:30:39 +08:00
    @chuangbo
    不管我懂多少,对你的回答内容表示同情,同时BS。
    zaykl
        34
    zaykl  
       2010-09-03 23:49:40 +08:00
    @iiduce
    其实就是等于你在服务器端访问另一个网站的内容,保存在本地服务器然后在show出来给browser端吧.
    如果没有误解的话,在

    来段简单的伪代码:
    html:
    <form action="/MainPage" method="post">
    <input type="text" name="num" />
    <input type="submit" />
    </form>


    python:
    class MainPage(webapp.RequestHandler):
    def post(self):
    num = self.request.get("num")
    url='http://www.v2ex.com/' +num
    content=urllib2.open(url).read()
    self.response.out.write(content)
    zaykl
        35
    zaykl  
       2010-09-03 23:54:49 +08:00
    @iiduce 希望楼主不要介意,因为你的基础知识真的不敢恭维...但是难得有这样的毅力自学已经是蛮难得的.楼主加油,自己也是从菜鸟被鄙视出来的...
    iiduce
        36
    iiduce  
    OP
       2010-09-03 23:57:44 +08:00
    @zaykl
    谢谢你的答案。

    我确实是一时没有转过弯来。也想过这样的方案:请求自己网站的页面,然后用自己网站页面去请求另一个地址,但是这样自己网站的页面就成了一个代理接口了,没有什么意义。

    你的例子中使用了post提交,因为浏览器post请求不能跨域的限制,也就解决了我的问题。


    虽然受到好多人BS,不过学到了。 谢谢。
    rveo
        37
    rveo  
       2010-09-04 00:19:38 +08:00
    @iiduce OK,我最闲,我来抓刀通俗(非专业)地说说 B/S 原理先。

    B/S = 浏览器端(Browser,也叫客户端)/ 服务器端(Server)结构。

    当用户使用浏览器在网页上操作(链接,表单,脚本事件)时,浏览器会发送一个请求(GET/POST,仅有此2种方式)到服务器端,服务器端接到请求后,调取相应的程序,执行处理,然后生成浏览器端能识别的数据,返回给浏览器,如此完成一个请求。这个数据包括:文本,图片,流媒体等等。而能在浏览器上构成网页的,目前只有HTML这个文本性质的网页脚本(什么xml,wml,也都是文本性质的)。HTML 的作用就是告诉浏览器,我要显示些什么东西。(CSS是告诉浏览器怎么显示,javascript是辅助性客户端程序脚本。)

    好了,这就是一个大概,与 C/S 端最大的不同就是:HTML是公开的,因为要给所有网页浏览器识别,而不是封装的,他相当于是可移植的,你用任何网页浏览器都能打开。

    而楼主你的问题也就在这里了。其实你在C/S端请求时,也是类似的过程,只是,你是封装的。

    网页中,你任何操作都是公开的,不借助javascript,你只能链接和发送表单。在网站的世界里,数据除了GET和POST,还可以借助cookies传输,但操作请求的只能是一个网址,而且只能GET或POST。
    iiduce
        38
    iiduce  
    OP
       2010-09-04 00:28:13 +08:00
    @rveo
    谢谢普及知识。

    B/S = 浏览器端(Browser,也叫客户端)/ 服务器端(Server)结构。

    您说的公开是指浏览器端公开,服务器端代码对用户是隐藏的。

    服务器端语言写的B/S程序:客户端请求——服务器端处理并生成或改造html——返回html

    您说的C/S模式好像与我们的问题没有什么关系。
    sogood
        39
    sogood  
       2010-09-04 00:29:03 +08:00
    这个必须mark...
    rveo
        40
    rveo  
       2010-09-04 00:34:18 +08:00
    @iiduce 额,我对C/S了解不深,或许我对C/S的说法是有异议的。不管他。

    “您说的公开是指浏览器端公开,服务器端代码对用户是隐藏的。 ” 嗯,是。

    在 B/S 里,所有的触发事件都需要最终转化为GET/POST请求。否则无法跟服务器沟通。
    iiduce
        41
    iiduce  
    OP
       2010-09-04 00:37:08 +08:00
    @rveo
    既然你非要认为我问的问题是个和B/S原理相关的问题,推荐篇我的博客上曾经转载的一篇文章,

    http://css9.net/what-happened-when-you-navigate/
    rveo
        42
    rveo  
       2010-09-04 00:46:05 +08:00
    @iiduce 嗯,你这篇文章是更详细地解释了B/S的交互细节。但是,里面发送请求也是离不开GET/POST,请求的网址依然是公开的。这个是不可能隐藏的。
    ong
        43
    ong  
       2010-09-04 00:50:05 +08:00
    @iiduce 依然建议你学下.net的mvc框架,这样子你概念转换的速度会快点
    iiduce
        44
    iiduce  
    OP
       2010-09-04 00:52:33 +08:00
    @rveo
    要睡了,看到你的回复还是忍不住要说几句。

    首先,我们一直说的都是B/S(浏览器程序)的事情,与C/S(客户端程序)无关。

    其次,B/S里面包含S,即Server,即服务器。你强调的部分一直是B,浏览器在做的事情。

    最后,在Server中,我们同样可以去通过Get/Post方式请求网址,Server中做的事情对于浏览者来说is a secret。
    iiduce
        45
    iiduce  
    OP
       2010-09-04 00:54:58 +08:00
    @ong

    我认同,是概念转换的问题。
    rveo
        46
    rveo  
       2010-09-04 01:02:01 +08:00
    @iiduce 莫非我搞错了?你请求一个网址 X 到服务器,你在服务器端转去 M,对于用户可能是不知道 M ,但是,你这个 X 是公开的啊,只要请求 X 就可以得到 M 的数据,我何必管你 M 是什么呢?
    iiduce
        47
    iiduce  
    OP
       2010-09-04 01:16:04 +08:00
    @rveo
    就拿上面zaykl同学写的示例来说:
    html:
    <form action="/MainPage" method="post">
    <input type="text" name="num" />
    <input type="submit" />
    </form>

    python:
    class MainPage(webapp.RequestHandler):
    def post(self):
    num = self.request.get("num")
    url='http://www.v2ex.com/' +num
    content=urllib2.open(url).read()
    self.response.out.write(content)

    其中网址X应该是“/MainPage”,网址X应该是“http://www.v2ex.com/3”

    X是公开了,但是他接受的是post请求,第三方又如何使用?
    Majia
        48
    Majia  
       2010-09-04 01:31:16 +08:00
    当服务器收到request之后,想怎么弄就怎么弄啊
    iiduce
        49
    iiduce  
    OP
       2010-09-04 01:42:28 +08:00
    @Majia
    受浏览器局限,post请求是不允许跨域提交的。
    GordianZ
        50
    GordianZ  
    MOD
       2010-09-04 02:10:48 +08:00
    @iiduce JS不能跨域,但是HTML FORM没有任何问题啊
    而且你的表述实在是让人难以明白 =。=
    rveo
        51
    rveo  
       2010-09-04 02:10:56 +08:00
    @iiduce 可以用其他程序,
    比如,ASP.Net 里就有 HttpWebRequest 可以跨域发送 POST 请求,ASP 里有 xmlhttp ,PHP 里有 file_get_contents / fsockopen 等等。

    完全可以跨域 POST 请求 X/MainPage 路径,才不管你 “http://www.v2ex.com/3” 呢!

    甚至,我还可以冒充 X 这个网址发送请求到 X/MainPage ~

    现在很多网站注册或者登录要用验证码,其实就是为了防止非法提交。。
    zxb888
        52
    zxb888  
       2010-09-04 06:54:06 +08:00
    有意思的问题,有意思的回答!
    我相信#22的 @rveo 说的是完全正确的!
    est
        53
    est  
       2010-09-04 09:36:56 +08:00
    研究html+http底层最好从CGI入手。写几次CGI程序之后什么FCGI WSGI都不在话下了。对MVC也会有更深的了解。
    zuroc
        54
    zuroc  
       2010-09-08 14:49:57 +08:00
    1.用jquery
    2.html页面里面写 $.post("/xx/xx/xx",{data:data},function(){
    //............
    })
    3.定义/xx/xx/xx
    makestory
        55
    makestory  
       2010-09-09 00:05:52 +08:00
    @Majia

    有些不明白你为什么想要隐藏调用的url。

    是不是可以这样:把需要的请求的地址进行加密,然后在服务器端进行解密,还原出可读的请求,再进行响应,这样就相当于隐藏了接口了。

    不过这么做还是感觉很奇怪..
    sdhjl2000
        56
    sdhjl2000  
       2010-11-13 00:48:16 +08:00
    晕,lz没表达清楚啊,按提问的意思是简单的post/get搞定,再说webform的postback的viewstate也是可以base64解密看的也不安全。 看你4楼的回复你的意思应该是在服务器端模拟一个请求或者调用webservice等,而不将请求的实际服务页面等写在js里,在c#里有webrequest可以模拟请求或使用webservice,py里好像有个module是httplib.但是服务器端的执行的东西本身对前台就是不可见如果把权限控制好了后台验证,别人看不看得到请求的参数页面等又有什么关系呢
    chone
        57
    chone  
       2010-11-13 04:05:49 +08:00
    这些由html+css+javascript管的。
    普通情况用form,需要异步的时候使用ajax
    form就是普通的post,get request没有跨域限制,跨域不能的是ajax
    chone
        58
    chone  
       2010-11-13 04:06:51 +08:00
    @chone 总之这些和python完全没关系
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 06:15 · PVG 14:15 · LAX 22:15 · JFK 01:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.