1
billychow 2010-09-03 09:21:01 +08:00
又一个被 WebForm 毒害的...
|
2
makestory 2010-09-03 10:56:42 +08:00
不太清楚.net,VB。
不管怎样,你需要让点击这个按钮后会发起一次请求,写代码让服务器端响应这个请求做点什么事情。 具体讲可能这个按钮是个表单提交,或者触发一个ajax事件,服务起端可能是保存表单数据,或者返回搜索结果等等。建议你看一些web开发框架的文档,表单部分或ajax部分。 |
3
yuest 2010-09-03 10:57:27 +08:00
先确定一个框架,然后读它官方的 Tuturial 或者公认的入门好书。
|
4
iiduce OP @makestory
使用ajax的方式我倒是会。 但是我不希望通过ajax调用接口,因为我不想别人通过fiddler之类的工具看到我的接口。 在.net中,我使用按钮触发服务器端事件,在服务器端使用WebRequest去请求,能够隐藏我调用的接口。 |
5
iiduce OP |
6
ong 2010-09-03 11:13:12 +08:00
建议你花一周学下.net的MVC框架,然后来做python。
很多人VS拖拉了一俩年都不知道B/S的原理。 |
7
ccdjh 2010-09-03 11:19:57 +08:00
你是混淆了概念了吧?表单传递可以用post和get.
你的什么按钮触发服务器端事件。。是用在GUI上吧?例如使用Tkinter import Tkinter import * def xxxx() pass quit = Botton(command=xxxx) |
9
iiduce OP |
10
sjIwBjkW8fgByvSO 2010-09-03 11:24:41 +08:00
又一个被 WebForm 毒害的...
____________________________ +10086 |
11
sjIwBjkW8fgByvSO 2010-09-03 11:26:40 +08:00
django中没有 类似。NET控件这类东西,那是.NET独有的方式。
实现这个你要做的是在HTML中自己编写。 |
13
est 2010-09-03 12:23:34 +08:00
vs害人不浅啊不接啊。。。
|
14
iiduce OP @est
你们都在说winform、vs害人不浅,倒是说说怎么实现相同的操作啊。 你们可能认为事件绑定就是.net控件特有的,但我认为在其他语言中,可能不叫绑定,但应该有相同的实现吧。 或者说 我希望让页面中的某个元素触发一个事件,这个事件是去调用一个http接口(可以get或put的url),但是我不想让别人知道这个http接口,在python中如何实现呢? |
15
iiduce OP 或者举个具体的例子:
假设以get方式访问http://www.abc.com?code=1 ,可以返回一个json格式的数据。 我要在页面中实现用户点击一个按钮后,程序访问http://www.abc.com?code=1获得返回的json数据,用于在页面中显示。 在这个过程中,我不想用户知道数据是我访问了http://www.abc.com?code=1后获取的。 在python中如何实现? |
16
yiyang 2010-09-03 13:26:16 +08:00
@iiduce 不要在这里问问题拉浪费时间,其实VS这种方式也很好阿,开发效率也高。越简单越好,不要以为你们知道原理一个个的写就牛必了。关键是怎么最快出好用的产品赚钱啦
|
18
flytwokites 2010-09-03 14:05:34 +08:00
这个问题已经不是python的问题了。
另外我很好奇你为什么不想要用户知道访问什么url得到数据? |
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> |
20
huacnlee 2010-09-03 16:33:02 +08:00
@iiduce 推荐看看 Ruby on Rails http://guides.rubyonrails.org
|
21
iiduce OP @Paranoid
这样写实现功能是没问题,但我说不想请求地址http://www.abc.com?code=1让别人知道。这样写的话,用户可以查看源代码看到,也可以在请求时通过诸如fiddler,httpwatch等http工具看到。 |
24
est 2010-09-03 20:24:13 +08:00
@rveo .NET就是这样封装的。。。他们以为一个 runat='server' 客户端就看不到了。。。哈哈。。。逻辑都混杂写服务器了。
|
25
zaykl 2010-09-03 20:49:48 +08:00
杯具的事情总算再次遇到,同情楼主...你是自学编程的吧?
|
26
zaykl 2010-09-03 21:00:11 +08:00
曾经被人如此问倒...楼主加油.
VB真的害人不浅... 我还是为下一代着想 给出答案吧: http://www.djangoproject.com/documentation/0.95/request_response/ |
27
chuangbo 2010-09-03 22:09:09 +08:00
强烈同情这些被M$毒害、对运行机理一窍不通的孩子。特别是在V2EX的地方看到他们。
楼主的问题和 python 与否没有一点关系。还是回去鼠标拖控件吧。 |
28
zaykl 2010-09-03 23:01:24 +08:00
其实 我是明白了 楼主的意思....
汗... |
29
iiduce OP oh 我来了。 好热闹,很高兴看到有这么多人讨论。
|
30
iiduce OP 几位朋友如是说:
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是什么,您是如何知道的。 感激不尽。 |
32
iiduce OP @zaykl
http://www.djangoproject.com/documentation/0.95/request_response/ 您给的这个页面里面的内容以前看过,又看了一遍。没有发现如何解决。能给一点小小的提示么。 |
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) |
35
zaykl 2010-09-03 23:54:49 +08:00
@iiduce 希望楼主不要介意,因为你的基础知识真的不敢恭维...但是难得有这样的毅力自学已经是蛮难得的.楼主加油,自己也是从菜鸟被鄙视出来的...
|
36
iiduce OP @zaykl
谢谢你的答案。 我确实是一时没有转过弯来。也想过这样的方案:请求自己网站的页面,然后用自己网站页面去请求另一个地址,但是这样自己网站的页面就成了一个代理接口了,没有什么意义。 你的例子中使用了post提交,因为浏览器post请求不能跨域的限制,也就解决了我的问题。 虽然受到好多人BS,不过学到了。 谢谢。 |
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。 |
38
iiduce OP @rveo
谢谢普及知识。 B/S = 浏览器端(Browser,也叫客户端)/ 服务器端(Server)结构。 您说的公开是指浏览器端公开,服务器端代码对用户是隐藏的。 服务器端语言写的B/S程序:客户端请求——服务器端处理并生成或改造html——返回html 您说的C/S模式好像与我们的问题没有什么关系。 |
39
sogood 2010-09-04 00:29:03 +08:00
这个必须mark...
|
40
rveo 2010-09-04 00:34:18 +08:00
@iiduce 额,我对C/S了解不深,或许我对C/S的说法是有异议的。不管他。
“您说的公开是指浏览器端公开,服务器端代码对用户是隐藏的。 ” 嗯,是。 在 B/S 里,所有的触发事件都需要最终转化为GET/POST请求。否则无法跟服务器沟通。 |
41
iiduce OP |
42
rveo 2010-09-04 00:46:05 +08:00
@iiduce 嗯,你这篇文章是更详细地解释了B/S的交互细节。但是,里面发送请求也是离不开GET/POST,请求的网址依然是公开的。这个是不可能隐藏的。
|
44
iiduce OP @rveo
要睡了,看到你的回复还是忍不住要说几句。 首先,我们一直说的都是B/S(浏览器程序)的事情,与C/S(客户端程序)无关。 其次,B/S里面包含S,即Server,即服务器。你强调的部分一直是B,浏览器在做的事情。 最后,在Server中,我们同样可以去通过Get/Post方式请求网址,Server中做的事情对于浏览者来说is a secret。 |
46
rveo 2010-09-04 01:02:01 +08:00
@iiduce 莫非我搞错了?你请求一个网址 X 到服务器,你在服务器端转去 M,对于用户可能是不知道 M ,但是,你这个 X 是公开的啊,只要请求 X 就可以得到 M 的数据,我何必管你 M 是什么呢?
|
47
iiduce OP @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请求,第三方又如何使用? |
48
Majia 2010-09-04 01:31:16 +08:00
当服务器收到request之后,想怎么弄就怎么弄啊
|
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 ~ 现在很多网站注册或者登录要用验证码,其实就是为了防止非法提交。。 |
53
est 2010-09-04 09:36:56 +08:00
研究html+http底层最好从CGI入手。写几次CGI程序之后什么FCGI WSGI都不在话下了。对MVC也会有更深的了解。
|
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 |
55
makestory 2010-09-09 00:05:52 +08:00
@Majia
有些不明白你为什么想要隐藏调用的url。 是不是可以这样:把需要的请求的地址进行加密,然后在服务器端进行解密,还原出可读的请求,再进行响应,这样就相当于隐藏了接口了。 不过这么做还是感觉很奇怪.. |
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.但是服务器端的执行的东西本身对前台就是不可见如果把权限控制好了后台验证,别人看不看得到请求的参数页面等又有什么关系呢
|
57
chone 2010-11-13 04:05:49 +08:00
这些由html+css+javascript管的。
普通情况用form,需要异步的时候使用ajax form就是普通的post,get request没有跨域限制,跨域不能的是ajax |