2012-01-03 47 views
1

我试图获取在Python中未使用Web框架请求的网址。例如,在一个页面上(比如说/main/index.html),用户点击一个URL去/ main/foo/bar(/ foo/bar不存在)。然后,Apache(使用mod_wsgi)将用户重定向到/ main /的PHP脚本,然后获取URL并搜索MySQL以查找任何匹配的字段。然后剩下的字段被返回。这有助于在PHP中:在没有框架的情况下获取当前请求的Python网址

$_SERVER["REQUEST_URI"]; 

因为它变得越来越困难,而数据库在不断变化的结构来维护的PHP代码我宁可不使用PHP。

我很确定有一个更好的方法,任何提及将不胜感激。为了相关性,这甚至有可能(在Python中获取请求的URL)?我应该只使用一个框架,虽然看起来很简单吗?

由于提前,

杰米

注:我不想使用GET出于安全目的。

+1

你如何整合Python和Apache? CGI? mod_python的?反向代理和BaseHTTPServer?还有别的吗? – 2012-01-03 07:39:16

+0

抱歉。我正在使用mod_python。如果我使用mod_wsgi会更容易吗? – Jamie 2012-01-03 07:40:29

+2

如果你使用mod_wsgi,那么死亡率会更低。 – 2012-01-03 07:44:29

回答

1

与PHP,Python的是一种通用语言,并没有这种内置的。

你可以收集这些信息的方式取决于部署的解决方案:

  • CGI(主要是跟Apache mod_python的,不建议使用):看到@Antti哈帕拉解决方案
  • WSGI(其它大多数部署解决方案):见@gurney alex解决方案

但是你会遇到更多的问题:会话hanling,网址管理,cookies,甚至是简单的POST/GET解析。如果你不使用框架,所有这些都需要手动完成。如果你觉得像一个框架是过度杀伤(但真的,令人难以置信的工具像Django是值得的),你可以使用像微观框架bottle

微型框架通常会为您提供这种繁重的工作,但没有复杂的设置或额外的高级功能。瓶子实际上是零设置一个是一个文件库。

你好字与瓶:

from bottle import route, run, request 

@route('/hello/:name') 
def index(name='World'): 
    return '<b>Hello %s! You are at %s</b>' % (name, request.path) 

run(host='localhost', port=8080) 

request.path包含你想要什么,如果你访问http://127.0.0.1:8080/hello/you,您将获得:

Hello you! You are at /hello/you 
+0

感谢您的帮助。我删除了mod_python并切换到mod_wsgi。由于某种原因,最后一个命令 run(host ='localhost',port = 8080) 正在无限循环中运行,然后中断(带或不带apache)。这显然不正常。我的服务器在某处是否配置有误? – Jamie 2012-01-03 13:57:08

+0

run(host ='localhost',port = 8080)只是一个测试服务器,不适用于生产。这是一个无限循环,因为它是一个服务器。如果你想使用apache,你需要使用mod_wsgi来运行它,但是你通常会在你的开发周期结束时这样做,当你部署它来测试它时。你是用什么做的。 “它打破了什么意思” – 2012-01-03 16:00:06

+0

啊对,对不起,我现在明白了。谢谢你的帮助。 – Jamie 2012-01-07 12:09:13

6

那么,如果您将程序作为CGI脚本运行,则可以在os.environ中获得相同的信息。但是,如果我没有记错,REQUEST_URI本身不是CGI标准的一部分,您需要使用os.environ['SCRIPT_NAME'],os.environ['PATH_INFO']os.environ['QUERY_STRING']来获取等效数据。

不过,我非常希望你能看到一些轻量级的框架,比如金字塔。 Python的平原CGI速度很慢,通常只是屁股疼痛。

+0

我注意到了。谢谢你的帮助。 – Jamie 2012-01-03 07:58:39

+1

REQUEST_URI也是浏览器客户端提供的原始URL,未被规范化。它可能包含'../'序列,重复斜线和%编码,所有这些都可能被服务器以某种方式修改。因此,在尝试操纵REQUEST_URI的值时,您必须非常小心,因为您的解释可能最终与Web服务器将其解释为不同。当试图在斜线上分割时,原始中存在'../'序列尤其是个问题。 – 2012-01-03 21:56:01

0

当使用mod_python的,如果我没有记错,你可以使用类似:

from mod_python import util 
def handler(request):  
    parameters = util.FieldStorage(request) 
    url = parameters.get("url", "/") 

http://www.modpython.org/live/current/doc-html/pyapi-util.htmlmod_python.util模块的更多信息和FieldStorage类(包括示例)

1

当我想要得到任何框架之外的URL使用Apache2和Mod_WSGI我使用

environ.get('PATH_INFO')

在我的应用程序()函数内部。

相关问题