如何在父应用程序中发出子应用程序请求?

2024-09-29 23:27:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个web应用程序:父应用程序和子应用程序

假设,http://www.some.com/parent.png将由父应用程序处理。你知道吗

如果它是在另一个网站上引用的,父应用程序会得到一个HTTP引用,比如说http://www.other.com/path?query=value

我想一个子应用程序采取这个HTTP\u REFERER的路径和查询字符串作为他自己的路径和查询字符串,并返回结果到父应用程序,这样,父应用程序的网址不会改变,访客浏览器也不会得到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())

父.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/是网页.py包路径。你知道吗

那么,如何才能使(1)正确运行?

我想得到与(1)在shell中运行相同的结果:

>>> 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') 

使访问者看到结果,但我不希望浏览器跳转到另一个网址。你知道吗

我想

urllib2.urlopen('http://www.some.com/path?query=value') 

可以,但是有没有更好的方法可以在一个请求中完成呢?你知道吗

谢谢你的帮助!-----也谢谢你读这篇文章! ====================================================编辑==================================================

好吧,经过一些代码破解,我解决了一部分问题:

我加了一个模拟.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输入 父.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\u应用程序,使它成为一个独立的应用程序。你知道吗

我解决了我的问题,不是很完美,但有些困难。我想我会用它,当我有更多的时间,我会找到另一种方法。 如果你有更好的解决办法,请告诉我,谢谢。你知道吗

致以最诚挚的问候。你知道吗

你知道吗========================================= 我觉得我在自言自语,人在哪里?你知道吗


Tags: pathinpyselfwebapphomevalue

热门问题