Как сделать запрос sub_application в parent_application?
У меня есть два веб-приложения: parent_app и sub_app
скажем, что http://www.some.com/parent.png будет обрабатываться parent_app.
если это ссылка на другом веб-сайте, parent_app получает HTTP_REFERER, например, http://www.other.com/path?query=value,
Я хочу, чтобы sub_app использовал этот HTTP_REFERER path и query_string в качестве своего собственного path и query_string и возвратил результат в parent_app, поэтому URL-адрес parent_app не изменится, браузер посетителей также не получит 303-прыжок.
sub.py:
import web
class Sub(object):
def GET(self):
return web.input().query # I want it to be 'value', from "query=value"
urls = (r'/path', 'Sub')
sub_app = web.application(urls, locals())
parent.py:
import web
from sub import sub_app
class Parent(object):
def GET(self):
return sub_app.request('/path?query=value').data #=========(1)
urls = (
r'/parent.png', 'Parent',
r'', sub_app
)
parent_app = web.application(urls, locals())
и запустить:
>>>python parent.py
когда я захожу на сайт http://www.some.com/parent.png?
Я получаю эти ошибки:
Traceback (most recent call last):
File "/home/netroyal/Documents/program/studame/web/wsgiserver/__init__.py", line 1245, in communicate
req.respond()
File "/home/netroyal/Documents/program/studame/web/wsgiserver/__init__.py", line 775, in respond
self.server.gateway(self).respond()
File "/home/netroyal/Documents/program/studame/web/wsgiserver/__init__.py", line 2018, in respond
response = self.req.server.wsgi_app(self.env, self.start_response)
File "/home/netroyal/Documents/program/studame/web/httpserver.py", line 306, in __call__
return self.app(environ, xstart_response)
File "/home/netroyal/Documents/program/studame/web/httpserver.py", line 274, in __call__
return self.app(environ, start_response)
File "/home/netroyal/Documents/program/studame/web/application.py", line 279, in wsgi
result = self.handle_with_processors()
File "/home/netroyal/Documents/program/studame/web/application.py", line 249, in handle_with_processors
return process(self.processors)
File "/home/netroyal/Documents/program/studame/web/application.py", line 246, in process
raise self.internalerror()
File "/home/netroyal/Documents/program/studame/web/application.py", line 473, in internalerror
parent = self.get_parent_app()
File "/home/netroyal/Documents/program/studame/web/application.py", line 458, in get_parent_app
if self in web.ctx.app_stack:
AttributeError: 'ThreadedDict' object has no attribute 'app_stack'
/ home / netroyal / Documents / program / studame / web / - это путь к пакету web.py.
Итак, как я могу сделать (1) работает правильно?
Я хочу получить тот же результат, как (1) работает в оболочке:
>>> import web
>>> class Sub(object):
... def GET(self):
... return web.input().query
>>> urls = ('/path', 'Sub')
>>> sub_app = web.application(urls, locals())
>>> sub_app.request('/path?query=value').data #=========(1)'
'value'
>>>
Я знаю, я могу использовать
web.seeother('/path?query=value')
чтобы посетители увидели результат, но я не хочу, чтобы браузер перешел на другой URL.
Я думаю
urllib2.urlopen('http://www.some.com/path?query=value')
будет работать, но есть ли лучший способ сделать это в одном запросе?
спасибо за любую помощь!----- за это тоже! ========================================== Редактировать ======= ===============================
Хорошо, после некоторого взлома кода, я решил часть своей проблемы:
Я добавляю Simulation.py:
import web, re
class Simulation(object):
def __init__(self, urls, fvars):
self._urls = urls
self._fvars = fvars
def request(self, localpart='/', method='GET', data=None, host='0.0.0.0:8080', headers=None, https=False):
#nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
# get path and args(parameters from new url)
try:
path, query = localpart.split('?', 1)
except:
path, query = (localpart, '')
# get all arguments: args(parameters)
parts = query.split('&')
args = {}
for part in parts:
try:
name, value = part.split('=')
except:
pass
else:
args[name] = value
#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
patterns = [self._urls[2*i] for i in range(0, len(self._urls)/2)]
for i in range(0, len(patterns)):
result = re.match(patterns[i], path)
if result:
web.input = lambda: web.storage(args)
Worker = self._fvars[self._urls[2*i + 1]]
return Worker().GET(*result.groups())
#----------------------------------------------------------------------------------------
raise web.notfound()
и в sub.py:
from simulation import *
class Sub(object):
def GET(self):
return web.input().query # I want it to be 'value', from "query=value"
urls = (r'/path', 'Sub')
sub_app = web.application(urls, locals())
sub_sim = Simulation(urls, locals()) # new class to run request in parent_app
adn в parent.py:
import web
from sub import sub_app, sub_sim #sub_sim is new
class Parent(object):
def GET(self):
return sub_sim.request('/path?query=value') # sub_app changed to sub_sim, and no (.data)
urls = (
r'/parent.png', 'Parent',
r'', sub_app
)
parent_app = web.application(urls, locals())
и я могу использовать '/sub', чтобы посетить sub_app, оставив его автономным приложением.
Я решил свою проблему, не идеально, но довольно сложно. Я думаю, что я просто буду использовать это, когда у меня будет больше времени, я найду другой путь. если у вас есть лучшее решение, пожалуйста, скажите мне, спасибо.
С наилучшими пожеланиями.
=============================================== Я чувствую, что разговаривал сам с собой, где люди?