Python flask 请求加载页面
Python flask requests load page
创建从我的服务器加载页面的脚本(使用服务器 IP 等)- 一切正常,但如果我想点击任何 link 我会进入 404 错误页面,因为 link是 - 像这样的事情:
...37.139.17.81:5000/html/privacy-check.php
我的代码:
from flask import Flask
import requests
application = Flask(__name__)
@application.route("/")
def hello():
result = requests.get("http://ipinfo.info/index.php")
return result.content
if __name__ == "__main__":
application.run(host='0.0.0.0')
这是一个活生生的例子:
如何解析点击 URL 并获取此 link 内容?
您的 "script" 是本地服务器 http://37.139.17.81:5000/ 上的烧瓶应用程序 运行。
当您从从不同站点加载的页面单击 link 时,您的 Flask 应用程序合理地认为它是 Flask 应用程序中页面的 link,因此会尝试在本地应用程序上加载页面。
Flask 应用程序在本地服务器上查找 links 可能是因为您加载的页面上的 links 是相对的 links。
要解析 link,您可以使用 urlparse
from urlparse import urlparse
o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
o
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
params='', query='', fragment='')
我不得不问你为什么要尝试将 php 页面加载到 Flask 应用程序中?
对于href="/html/privacy-check.php"
你应该做
@application.route("/html/privacy-check.php")
def hello():
result = requests.get("http://ipinfo.info/index.php")
return result.content
由于在您的服务器上找不到 /html/privacy-check.php
的任何 url 匹配项,因此抛出 404 错误。
您基本上是在尝试让您的页面充当远程页面的代理。为了完全做到这一点,您需要处理远程页面中的所有 link。
因此,例如,如果有一个 link,例如 /something/something
,flask 将自动尝试将其与本地 url (http://yourserver.com/something/something
) 匹配。鉴于您只定义了一个路由 ("/"),应用程序将确定任何其他页面不存在,并将 return 一个 404。
要正确处理此问题,您可以尝试以下操作:
import urlparse
@application.route("/")
@application.route("/<url:path>")
def hello(url=None):
baseurl = "http://ipinfo.info/"
if not url:
result = requests.get(urlparse.urljoin(baseurl,"index.php"))
return result.content
else:
result = requests.get(urlparse.urljoin(baseurl,url))
return result.content
一句警告:这种方法在各种情况下可能会失败(例如 css 和 js 加载),因此您可能需要在页面加载后检查结果。
创建从我的服务器加载页面的脚本(使用服务器 IP 等)- 一切正常,但如果我想点击任何 link 我会进入 404 错误页面,因为 link是 - 像这样的事情:
...37.139.17.81:5000/html/privacy-check.php
我的代码:
from flask import Flask
import requests
application = Flask(__name__)
@application.route("/")
def hello():
result = requests.get("http://ipinfo.info/index.php")
return result.content
if __name__ == "__main__":
application.run(host='0.0.0.0')
这是一个活生生的例子:
如何解析点击 URL 并获取此 link 内容?
您的 "script" 是本地服务器 http://37.139.17.81:5000/ 上的烧瓶应用程序 运行。
当您从从不同站点加载的页面单击 link 时,您的 Flask 应用程序合理地认为它是 Flask 应用程序中页面的 link,因此会尝试在本地应用程序上加载页面。
Flask 应用程序在本地服务器上查找 links 可能是因为您加载的页面上的 links 是相对的 links。
要解析 link,您可以使用 urlparse
from urlparse import urlparse
o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
o
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
params='', query='', fragment='')
我不得不问你为什么要尝试将 php 页面加载到 Flask 应用程序中?
对于href="/html/privacy-check.php"
你应该做
@application.route("/html/privacy-check.php")
def hello():
result = requests.get("http://ipinfo.info/index.php")
return result.content
由于在您的服务器上找不到 /html/privacy-check.php
的任何 url 匹配项,因此抛出 404 错误。
您基本上是在尝试让您的页面充当远程页面的代理。为了完全做到这一点,您需要处理远程页面中的所有 link。
因此,例如,如果有一个 link,例如 /something/something
,flask 将自动尝试将其与本地 url (http://yourserver.com/something/something
) 匹配。鉴于您只定义了一个路由 ("/"),应用程序将确定任何其他页面不存在,并将 return 一个 404。
要正确处理此问题,您可以尝试以下操作:
import urlparse
@application.route("/")
@application.route("/<url:path>")
def hello(url=None):
baseurl = "http://ipinfo.info/"
if not url:
result = requests.get(urlparse.urljoin(baseurl,"index.php"))
return result.content
else:
result = requests.get(urlparse.urljoin(baseurl,url))
return result.content
一句警告:这种方法在各种情况下可能会失败(例如 css 和 js 加载),因此您可能需要在页面加载后检查结果。