Как сделать запрос 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, оставив его автономным приложением.

Я решил свою проблему, не идеально, но довольно сложно. Я думаю, что я просто буду использовать это, когда у меня будет больше времени, я найду другой путь. если у вас есть лучшее решение, пожалуйста, скажите мне, спасибо.

С наилучшими пожеланиями.

=============================================== Я чувствую, что разговаривал сам с собой, где люди?

0 ответов

Другие вопросы по тегам