在没有框架的情况下,在Python中获取当前请求的URL

时间:2012-01-03 07:32:34

标签: python url

我正在尝试在不使用Web框架的情况下获取Python中请求的URL。

例如,在页面上(比如说/main/index.html),用户点击一个URL转到/ main / foo / bar(/ foo / bar不存在)。 Apache(使用mod_wsgi)然后将用户重定向到/ main /上的PHP脚本,然后获取url并在MySQL中搜索任何匹配的字段。然后返回该字段的其余部分。这有助于PHP:

$_SERVER["REQUEST_URI"];

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

我很确定这是一种更好的方式,任何提及都会非常感激。为了相关性,这是否可能(在Python中获取请求的URL)?我应该只使用一个框架,虽然看起来很简单吗?

提前致谢,

杰米

注意:出于安全考虑,我不想使用GET。

4 个答案:

答案 0 :(得分:7)

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

但是,我强烈建议您看一些轻量级框架,例如Pyramid。使用Python的简单CGI很慢,通常只是痛苦。

答案 1 :(得分:1)

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

您收集此信息的方式取决于部署解决方案:

  • CGI(主要是带有mod_python的Apache,已弃用):请参阅@Antti Haapala解决方案
  • WSGI(大多数其他部署解决方案):请参阅@gurney alex solution

但是你会遇到更多的问题:会话处理,网址管理,cookie,甚至是简单的POST / GET解析。如果您不使用框架,所有这些都需要手动完成。

现在,如果你认为框架是过度的(但实际上,像Django这样令人难以置信的工具是值得的),你可以使用像bottle这样的微框架。

Microframeworks通常会为您提供繁重的工作,但不需要复杂的设置或其他高级功能。 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

答案 2 :(得分:1)

当我想使用Apache2和Mod_WSGI获取任何框架之外的URL时,我使用

environ.get('PATH_INFO')

在我的application()函数内部。

答案 3 :(得分:0)

使用mod_python时,如果我没记错,你可以使用类似的东西:

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

有关mod_python.util模块和FieldStorage课程(包括示例)的更多信息,请参阅http://www.modpython.org/live/current/doc-html/pyapi-util.html