博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Suffer Less By Using Django Dev Server as a Proxy
阅读量:7111 次
发布时间:2019-06-28

本文共 4389 字,大约阅读时间需要 14 分钟。


When doing web development, you'll occasionally run into a situation where you are developing a new user interface or otherwise redesigning a website, but either cannot or don't want to tear out the existing pieces you are replacing. Maybe the tyrannical IT department has to approve all reboots for the development server, or your new project is a quick prototype down a different line of thought and you don't want to devote time to replacing the current system before the prototype proves its value.

As it often does, Django steps in as a handy tool in this situation. With some minimal customization you can use the Django development server to serve certain urls patterns and transparently proxy the remainder to another server.

Why?

  1. For development, the Django development server is a real boon. It isn't quick, but it's quick enough, and its automatic reboots on code changes really speeds up development.

  2. You can transparently develop above an existing platform. This is especially true when building JavaScript heavy applications relying upon a RESTful api (because you are implementing new functionality on the client-side, and with your thoughtfully designed api you won't need to make changes to the server-side of the application).

    In particular, this approach allows you to use XMLHttpRequest-based

    Ajax functionality cross-domain without your browser slapping your hand and saying no. This works because you're requesting the URL locally,
    the proxy is fetching it from the remote host, and finally it is being returned to the requester it as if it all occurred locally.

    This also means that

    when you do integrate your new UI/feature into the existing application, you won't need to change any of the urls.

  3. Don't need admin access (or ability/know-how to build) the

    main server. You don't have to wait for the server to reboot,
    caches to clear, or settings to reset.

How?

Using Django as a proxy is quite simple. First you'll need to install Django and Httplib2:

curl http://www.djangoproject.com/download/1.0/tarball/ > Django-1.0.tar.gztar xzvf Django-1.0.tar.gzcd Django-1.0sudo python setup.py installsudo easy_install httplib2

Next put together a standard settings.py file. If you're just developing a new appearance or interface using static files, then your settings might look as simple as this:

import osROOT_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 = TrueTEMPLATE_DEBUG = DEBUGADMINS = ()MANAGERS = ADMINSTIME_ZONE = 'America/Chicago'LANGUAGE_CODE = 'en-us'SITE_ID = 1USE_I18N = TrueMEDIA_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 = ()

Then you also need to edit the project's urls.py, which is where the magic happens.

import httplib2from urllib import urlencodefrom django.conf.urls.defaults import *from django.conf import settingsfrom django.http import HttpResponsePROXY_FORMAT = u"http://%s/%s" % (settings.PROXY_DOMAIN, u"%s")def proxy(request, url):    conn = httplib2.Http()    # optionally provide authentication for server    #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
.*)

, 'django.views.static.serve', {

'document_root': settings.MEDIA_ROOT }), (r'^(?P<url>.*) , proxy), )

You may have to change urls around a bit for your specific circumstances, but that's basically it.

Let me know if there any questions or problems. As mentioned, this is definitely a development solution, as all solutions involving the Django dev server are, and especially as all solutions with the Django dev server serving media are.

Take it with a few grains of salt. Or a lemon. Or a shot of tequila. Preferably not in that order.

转载地址:http://mdmhl.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
hadoop伪分布式搭建,运行 wordcount
查看>>
数据分析常用到的文件排序及对比命令
查看>>
SlidingUpPanel开源项目的用法
查看>>
Linux文件管理类命令之mv
查看>>
select循环
查看>>
spring整合quartz实现定时任务
查看>>
我的友情链接
查看>>
实习了两个月了,说说感悟吧..
查看>>
我的友情链接
查看>>
SQL Server 2016下SSMS通过FULL备份数据还原指定表信息
查看>>
所有的程序员都是自学成才
查看>>
我的友情链接
查看>>
数据库测试技巧和方法
查看>>
我的友情链接
查看>>
JS实现系统调色板
查看>>
Spring3注解零配置【私塾在线原创】
查看>>
可变数组不下心变成了不可变数组
查看>>
GOROOT与GOPATH
查看>>
我的友情链接
查看>>