我正在尝试在不使用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。
答案 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是一种通用语言,没有内置的。
您收集此信息的方式取决于部署解决方案:
但是你会遇到更多的问题:会话处理,网址管理,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