Представьте, что вам необходимо создать 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.
Комментариев нет:
Отправить комментарий