Blog Entry: Джанго devserver и пароли
У каждого Django разработчика в активной разработке наверное по 2-3 проекта, и ещё 10-30 "висят" на поддержке. Если при этом по обычному стартовать dev. server:
alex@avk ~/dev/deluxe.kharkov.ua $ ./manage.py runserver 20:03:05 Validating models... 0 errors found Django version 1.3 pre-alpha SVN-13379, using settings 'core.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
то для входа в админку и другие разделы сайта очень быстро произойдёт путаница - даже если браузер будет запоминать пароли, но толку не будет никакого, так как если пользователь один а паролей много - они начнут перекрывать друг друга.
Чтобы такого не происходило, была сделана вот такая вот придумка, для fabriс написан скрипт, который вычесляет сумму буковок для расположения текущего проекта и использует результат для кормления (или наверное правильно перевести seed как "осеменение") генератора случайных чисел, который выдаёт случайный порт в заданном диапазоне портов.
Вероятность совпадения портов небольшая, и работать стало намного удобнее. Для каждого проекта свой локальный порт.
alex@avk ~/dev/deluxe.kharkov.ua $ fab runserver 20:11:26 [localhost] run: ./manage.py runserver local.dev:4085 Validating models... 0 errors found Django version 1.3 pre-alpha SVN-13379, using settings 'core.settings' Development server is running at http://local.dev:4085/ Quit the server with CONTROL-C.
Скрипт:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from fabric.api import local, cd
import random
def runserver(server_address='127.0.0.1'):
""" Run dev server in unique manner - on a port, which depends on project path.
This allows to run different projects, on different paths, so stored passwords
are not mixed up, when running multiple projects on same URL
(e.g. http://127.0.0.1:8000/)
If local.dev is present in /etc/hosts, it is used to start server. This is needed
for local development purposes, so virtual environments (like VirtualBox)
can access internal IP (usually 10.10.10.x).
"""
summ = sum([ord(char) for char in PROJECT_ROOT.split('/')[-2]])
random.seed(summ)
port = random.randrange(1024,5000)
if os.path.exists('/etc/hosts'):
with open('/etc/hosts') as f:
if f.read().find('local.dev') != -1:
server_address = 'local.dev'
with cd(PROJECT_ROOT):
local('./manage.py runserver %s:%d' % (server_address,
port), capture=False)
