вторник, 13 ноября 2012 г.

Python Proxy

Представьте, что вам необходимо создать Proxy сайт на Python для получения веб-страниц или картинок. Например, ваш сервер получает запрос вида domain1.com/?url=domain2.com/image.png , где domain1.com - это ваш сервер, который будет отвечать за получения данных с домена domain2.com/image.png через сервер домена domain1.com .

Естественно вы хотите передать Proxy-серверу URL, который хотите фетчить для того, чтобы Proxy-сервер его обработал.

Написать Proxy сайт с использовованием Django очень просто.

Сперва вам необходимо установить Django и Httplib2:

curl http://www.djangoproject.com/download/1.0/tarball/ > Django-1.0.tar.gz
tar xzvf Django-1.0.tar.gz
cd Django-1.0
python setup.py install
easy_install httplib2

Далее отредактируйте файл settings.py в вашем Django приложении примерно так:

import os
ROOT_PATH = os.path.dirname(__file__)
# Change this to the domain where you
# want requests to be proxied to.
PROXY_DOMAIN = "127.0.0.1:5678"
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = ()
MANAGERS = ADMINS
TIME_ZONE = 'America/Chicago'
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
USE_I18N = True
MEDIA_ROOT = os.path.join(ROOT_PATH, 'ui')
MEDIA_URL = 'http://127.0.0.1:8000/media/'
ADMIN_MEDIA_PREFIX = '/admin_media/'
SECRET_KEY = 'etcetcetc'
TEMPLATE_LOADERS = ()
MIDDLEWARE_CLASSES = ('django.middleware.common.CommonMiddleware',)
ROOT_URLCONF = 'proxy_server.urls'
TEMPLATE_DIRS = ()
INSTALLED_APPS = ()

Затем вам необходимо отредактировать файл urls.py. В нем как раз и будет происходить весь процесс создания Proxy сайта:

import httplib2
from urllib import urlencode
from django.conf.urls.defaults import *
from django.conf import settings
from django.http import HttpResponse

PROXY_FORMAT = u"http://%s/%s" % (settings.PROXY_DOMAIN, u"%s")

def proxy(request, url):
    conn = httplib2.Http()
    # Дополнительно вы можете передать логин и пароль для подключения к удаленному серверу.
    #conn.add_credentials('admin','admin-password')
    if request.method == "GET":
        url_ending = "%s?%s" % (url, urlencode(request.GET))
        url = PROXY_FORMAT % url_ending
        resp, content = conn.request(url, request.method)
        return HttpResponse(content)
    elif request.method == "POST":
        url = PROXY_FORMAT % url
        data = urlencode(request.POST)
        resp, content = conn.request(url, request.method, data)
        return HttpResponse(content)

urlpatterns = patterns('',
    (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT }),
    (r'^(?P<url>.*)$', proxy),
)

Вы можете немного изменить адреса URL под ваши нужды.

Если вы фетчите файл, который возвращает картинку, то вам надо изменить mimetype вашего объекта HttpResponse.

Самым простой способ фетчинга картинок:

import httplib2
from django.conf.urls.defaults import *
from django.http import HttpResponse

# proxies the google logo
def test(request):
    url = "http://www.google.com/logos/classicplus.png"
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    return HttpResponse(response.read(), mimetype="image/png")

Или используйте Proxy библиотеку для Python под названием Mechanize, которая позволяет выбрать proxy и работать подобно браузеруr, позволяя легко изменять user agent, переходить назад и вперед по history и управлять authentification и cookies.

Комментариев нет:

Отправить комментарий