在不使用框架的情况下获取当前请求的URL

1 投票
4 回答
7994 浏览
提问于 2025-04-17 09:26

我想在Python中获取用户请求的URL,但不想使用任何网络框架。

举个例子,假设用户在一个页面(比如说 /main/index.html)上点击了一个链接,想要去 /main/foo/bar(/foo/bar 这个地址并不存在)。然后,Apache(配合 mod_wsgi)会把用户重定向到一个位于 /main/ 的PHP脚本,这个脚本会获取用户请求的URL,并在MySQL数据库中查找匹配的字段,最后返回相关的数据。在PHP中,这个过程是这样的:

$_SERVER["REQUEST_URI"];

我不太想用PHP,因为随着数据库结构的不断变化,维护PHP代码变得越来越困难。

我觉得应该有更好的方法,如果有人能提到一下,我会非常感激。为了相关性,问一下,这在Python中是否可能(获取请求的URL)?我是否应该使用一个框架,尽管看起来这个需求很简单?

提前感谢,

Jamie

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

4 个回答

1

当我想在不使用任何框架的情况下,通过Apache2和Mod_WSGI获取一个网址时,我会在我的应用程序函数里面使用

environ.get('PATH_INFO')

这个代码。

9

好吧,如果你把程序当作CGI脚本来运行,你可以在os.environ里获取到相同的信息。不过,我记得REQUEST_URI并不是CGI标准的一部分,所以你需要用os.environ['SCRIPT_NAME']os.environ['PATH_INFO']os.environ['QUERY_STRING']来获取相应的数据。

不过,我真心建议你看看一些轻量级的框架,比如Pyramid。用Python写普通的CGI脚本速度慢,而且通常会让人很头疼。

1

和PHP不同,Python是一种通用编程语言,没有内置的这个功能。

获取这些信息的方法取决于你使用的部署方案:

  • CGI(主要是Apache配合mod_python,现在已经不推荐使用了):可以参考@Antti Haapala的解决方案
  • WSGI(大多数其他部署方案):可以参考@gurney alex的解决方案

不过,你会遇到更多问题,比如会话管理、网址管理、Cookies,甚至简单的POST/GET请求解析。如果不使用框架,这些都需要手动处理。

如果你觉得使用框架太复杂(但其实像Django这样的工具非常值得),你可以选择一个微框架,比如bottle

微框架通常会为你处理这些繁琐的工作,但设置起来简单,也没有额外的复杂功能。Bottle实际上不需要任何设置,只是一个文件的库。

使用bottle的Hello World示例:

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

撰写回答