Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Twisted: сервер для перенаправления запросов [RSS Feed]

#1 Сен. 10, 2009 15:02:52

SS
От:
Зарегистрирован: 2009-09-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted: сервер для перенаправления запросов

Добрый день.
В Twisted и в питоне я новичок. Неделю не могу решить задачу. Вся надежда на Вашу помощь.
Есть следующий код, который замечательно работает.

#!/usr/local/bin/python
# -*- coding: UTF-8 -*-
from twisted.internet import reactor
from twisted.web import client
from sslctx import makeSSLContext

url='https://www.test.ru/test/'

def printValue(value):
print ‘value: ’ + value
reactor.stop( )

def printError(error):
print ‘error’, error
reactor.stop()

mess=“%s?function=check”%(url)

ctx = makeSSLContext(myKey=client_key, trustedCA=caCert)
req=client.getPage(url,contextFactory=ctx,method='GET %s'%(mess))
req.addCallback(printValue)
req.addErrback(printError)
reactor.run()

задача в том, чтобы написать вспомогательный сервер, который бы получал некие данные от клиента, на основании которых
формировал запрос к серверу 'https://www.test.ru/test/', аналогичный приведенному выше, получал ответ и отправлял клиенту.
Бьюсь неделю, не могу понять, как мне с сервера отправить запрос и получить ответ. Т.е. данные от клиента я получаю, формирую mess,
дальше

req=client.getPage(url,contextFactory=ctx,method='GET %s'%(mess))
req.addCallback(printValue)
req.addErrback(printError)

а вот что дальше? Запрос не уходит. Реактор уже запущен в сервере. Что нужно сделать, чтобы отправить запрос ?



Отредактировано (Сен. 10, 2009 16:06:31)

Офлайн

#2 Сен. 10, 2009 17:11:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Twisted: сервер для перенаправления запросов

А reactor.run точно был?
На взгляд все правильно.
Вспомогательный сервер - это twisted.web.server:Site?
Тогда нужно в render_GET ресурса возвращать server.NOT_DONE_YET, делать запрос к сайту и в callback заполнить request.



Офлайн

#3 Сен. 11, 2009 07:02:21

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Twisted: сервер для перенаправления запросов

Что за бред:
req=client.getPage(url,contextFactory=ctx,method='GET %s'%(mess))

Почему такой вариант не устраивает:
req = client.getPage(url + ‘?function=check’, contextFactory = ctx)

method может быть только GET, POST, HEAD и тому подобное. Что касается SSL - не пользовал, может и здесь есть ошибки - не знаю.

..bw



Офлайн

#4 Сен. 11, 2009 10:44:46

SS
От:
Зарегистрирован: 2009-09-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted: сервер для перенаправления запросов

Андрей Светлов
А reactor.run точно был?
На взгляд все правильно.
Вспомогательный сервер - это twisted.web.server:Site?
Тогда нужно в render_GET ресурса возвращать server.NOT_DONE_YET, делать запрос к сайту и в callback заполнить request.
Полностью код привести нет возможности из-за объема.
Вспомогательный сервер запускаю так:

from twisted.web import server, resource
from twisted.internet import reactor
from twisted.python import log, logfile
from switcher import SWITCHER

# Логирование опускаю

http_port= 8080
# INIT WEB RESOURCES
root = resource.Resource()
root.putChild('switcher',SWITCHER())
reactor.listenTCP(http_port,server.Site(root))
reactor.run()

Сокращенный модуль switcher.py Но логика примерно следующая:

from BeautifulSoup import BeautifulStoneSoup
from twisted.web import http,resource,server,client
from twisted.internet import interfaces, defer, threads
from sslctx import makeSSLContext
from mod_msg1 import MSG

client_key='client.pem'
caCert='CaCert.pem'
url='https://www.test.ru/test'

class SWITCHER(resource.Resource):

def __init__(self,debug_level=2):
self.msg=MSG(msg=':SWITCHER:',err=':SWITCHER:',dbg=':SWITCHER:',dbg_lvl=debug_level)

def answ_ok(self,xml,request):
request.write(xml)
self.msg.msg('OUTGOING RESPONSE')
request.finish()
request.transport.loseConnection()

def answ_err(self,error,request):
self.msg.err('PLEASE CALL TO ADMIN !!!\n%s'%(error))
# опускаю зоздание answ
request.write(resp%answ)
request.finish()
request.transport.loseConnection()

def render(self,request):
data = request.content.read()
self.msg.dbg('REQUEST BODY: %s'%(str(data)))
d = threads.deferToThread(self.switch,data)
d.addCallback(self.answ_ok, request)
d.addErrback(self.answ_err, request)
return server.NOT_DONE_YET

def printValue(self,value):
self.msg.msg('SERVER RESPONSE:'%(str(value)))
return value

def printError(self,error):
self.msg.err('PLEASE CALL TO ADMIN !!!\n%s'%(error))
return error


def switch(self,data):
# опускаю обработку пришедших данных и формирование нужного запроса
# на самом деле формирование запроса и запрос к серверу происходят при вызове метода
# некоего объекта, класс которого описан в другом модуле

mess=“%s?function=check”%(url) # строка параметров для метода GET
ctx = makeSSLContext(myKey=client_key, trustedCA=caCert)
req=client.getPage(url,contextFactory=ctx,method='GET %s'%(mess))
req.addCallback(self.printValue)
req.addErrback(self.printError)

return req.result

В логе следующее: Failure instance: Traceback: <type ‘exceptions.AttributeError’>: Deferred instance has no attribute ‘result’
Т.е getPage не срабатывает. Что я делаю не так? Простите за объемный код.



Офлайн

#5 Сен. 11, 2009 10:51:54

SS
От:
Зарегистрирован: 2009-09-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted: сервер для перенаправления запросов

bw
Что за бред:
req=client.getPage(url,contextFactory=ctx,method='GET %s'%(mess))..bw
Это требование протокола обмена с данным сервером - SSL, метод GET со строкой параметров.
В клиенте я тестировал, код успешно выполняется, сервер возвращает нужный ответ.



Офлайн

  • Начало
  • » Network
  • » Twisted: сервер для перенаправления запросов[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version