from django.http import HttpResponse
from django.conf import settings
class BasicAuthMiddleware(object):
def unauthed(self):
response = HttpResponse("""<html><title>Auth required</title><body>
<h1>Authorization Required</h1></body></html>""", mimetype="text/html")
response['WWW-Authenticate'] = 'Basic realm="Development"'
response.status_code = 401
return response
def process_request(self,request):
if not request.META.has_key('HTTP_AUTHORIZATION'):
return self.unauthed()
else:
authentication = request.META['HTTP_AUTHORIZATION']
(authmeth, auth) = authentication.split(' ',1)
if 'basic' != authmeth.lower():
return self.unauthed()
auth = auth.strip().decode('base64')
username, password = auth.split(':',1)
if username == settings.BASICAUTH_USERNAME and password == settings.BASICAUTH_PASSWORD:
return None
return self.unauthed()
Django Basic Auth middleware использует username и password, определенные в файле settings.py через константы BASICAUTH_USERNAME и BASICAUTH_PASSWORD. Данный способ идентификации пользователей не использует Django auth. Однако такой способ достаточно удобен для быстрого сокрытия части сайта на период разработки.
Настройки для примера.
settings.py:
BASICAUTH_USERNAME = 'user'
BASICAUTH_PASSWORD = 'pass'
MIDDLEWARE_CLASSES = (
'app.module.BasicAuthMiddleware',
#all other middleware
)
вторник, 26 февраля 2013 г.
четверг, 21 февраля 2013 г.
Pixel Perfect возвращение кнопки Add overlay в FireFox
В последних версиях FireFox 13, 14 у Pixel Perfect пропала кнопка "Add overlay".
Для того, чтобы она опять появилась необходимо проделать следующие действия:
- запустить FireFox;
- вызвать Firebug;
- нажать на кнопку "Open Firebug on New Window";
- закрыть FireFox;
- открыть FireFox и вызвать Firebug.
К сожалению, если свернуть Firebug обратно в окно браузера, то кнопка пропадает и нужно проводить данную процедуру еще раз.
Для того, чтобы она опять появилась необходимо проделать следующие действия:
- запустить FireFox;
- вызвать Firebug;
- нажать на кнопку "Open Firebug on New Window";
- закрыть FireFox;
- открыть FireFox и вызвать Firebug.
К сожалению, если свернуть Firebug обратно в окно браузера, то кнопка пропадает и нужно проводить данную процедуру еще раз.
среда, 20 февраля 2013 г.
Django Session Работа с сессиями
# Установить сессионное значение:
request.session["fav_color"] = "blue"
# Получить сессионное значение:
fav_color = request.session["fav_color"]
# Удалить сессионное значение:
del request.session["fav_color"]
# Проверить существует ли сессионное значение с данным ключем:
if "fav_color" in request.session:
...
request.session["fav_color"] = "blue"
# Получить сессионное значение:
fav_color = request.session["fav_color"]
# Удалить сессионное значение:
del request.session["fav_color"]
# Проверить существует ли сессионное значение с данным ключем:
if "fav_color" in request.session:
...
Django Cookie Установка и Получение
views.py
# Get cookie
def favorite_color(request):
if 'favorite_color' in request.COOKIES:
favorite_color = request.COOKIES['favorite_color']
return HttpResponse('Your favorite color is %s' % favorite_color)
else:
return HttpResponse('You don\'t have a favorite color.')
# Set cookie
def set_color(request):
if 'favorite_color' in request.GET:
response = HttpResponse('Your favorite color is %s' % request.GET['favorite_color'])
response.set_cookie('favorite_color', request.GET['favorite_color'])
return response
else:
return HttpResponse('You don\'t have a favorite color.')
# Get cookie
def favorite_color(request):
if 'favorite_color' in request.COOKIES:
favorite_color = request.COOKIES['favorite_color']
return HttpResponse('Your favorite color is %s' % favorite_color)
else:
return HttpResponse('You don\'t have a favorite color.')
# Set cookie
def set_color(request):
if 'favorite_color' in request.GET:
response = HttpResponse('Your favorite color is %s' % request.GET['favorite_color'])
response.set_cookie('favorite_color', request.GET['favorite_color'])
return response
else:
return HttpResponse('You don\'t have a favorite color.')
Django Создание скачиваемого PDF файла
views.py
from reportlab.pdfgen import canvas # НЕОБХОДИМО УСТАНОВИТЬ ОТДЕЛЬНО!!!
from django.http import HttpResponse
def hello_pdf(request):
# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=hello.pdf'
# Create the PDF object, using the response object as its "file."
p = canvas.Canvas(response)
# Draw things on the PDF. Here's where the PDF generation happens.
# See the ReportLab documentation for the full list of functionality.
p.drawString(100, 100, "Hello world.")
# Close the PDF object cleanly, and we're done.
p.showPage()
p.save()
return response
Усложнение файла.
views.py
from cStringIO import StringIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse
def hello_pdf(request):
# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=hello.pdf'
temp = StringIO()
# Create the PDF object, using the StringIO object as its "file."
p = canvas.Canvas(temp)
# Draw things on the PDF. Here's where the PDF generation happens.
# See the ReportLab documentation for the full list of functionality.
p.drawString(100, 100, "Hello world.")
# Close the PDF object cleanly.
p.showPage()
p.save()
# Get the value of the StringIO buffer and write it to the response.
response.write(temp.getvalue())
return response
from reportlab.pdfgen import canvas # НЕОБХОДИМО УСТАНОВИТЬ ОТДЕЛЬНО!!!
from django.http import HttpResponse
def hello_pdf(request):
# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=hello.pdf'
# Create the PDF object, using the response object as its "file."
p = canvas.Canvas(response)
# Draw things on the PDF. Here's where the PDF generation happens.
# See the ReportLab documentation for the full list of functionality.
p.drawString(100, 100, "Hello world.")
# Close the PDF object cleanly, and we're done.
p.showPage()
p.save()
return response
Усложнение файла.
views.py
from cStringIO import StringIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse
def hello_pdf(request):
# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=hello.pdf'
temp = StringIO()
# Create the PDF object, using the StringIO object as its "file."
p = canvas.Canvas(temp)
# Draw things on the PDF. Here's where the PDF generation happens.
# See the ReportLab documentation for the full list of functionality.
p.drawString(100, 100, "Hello world.")
# Close the PDF object cleanly.
p.showPage()
p.save()
# Get the value of the StringIO buffer and write it to the response.
response.write(temp.getvalue())
return response
Django Создание скачиваемого CSV файла
views.py
import csv
data = [146, 184, 235, 200, 226, 251, 299, 273, 281, 304, 203]
def get_csv(request):
# Create the HttpResponse object with the appropriate CSV header.
response = HttpResponse(mimetype = 'text/csv')
response['Content-Disposition'] = 'attachment; filename = data.csv'
# Create the CSV writer using the HttpResponse as the "file."
writer = csv.writer(response)
writer.writerow(['Year', 'Airline Passengers'])
for (year, num) in zip(range(1995, 2006), data):
writer.writerow([year, num])
return response
import csv
data = [146, 184, 235, 200, 226, 251, 299, 273, 281, 304, 203]
def get_csv(request):
# Create the HttpResponse object with the appropriate CSV header.
response = HttpResponse(mimetype = 'text/csv')
response['Content-Disposition'] = 'attachment; filename = data.csv'
# Create the CSV writer using the HttpResponse as the "file."
writer = csv.writer(response)
writer.writerow(['Year', 'Airline Passengers'])
for (year, num) in zip(range(1995, 2006), data):
writer.writerow([year, num])
return response
Django Скачивание файла Image с сайта
import os
from django.http import HttpResponse
def get_image(request):
image_path = os.path.join(os.path.dirname(__file__), 'images/picture.png')
image_file = open(image_path, 'rb')
image_data = image_file.read()
return HttpResponse(image_data, mimetype='image/png')
from django.http import HttpResponse
def get_image(request):
image_path = os.path.join(os.path.dirname(__file__), 'images/picture.png')
image_file = open(image_path, 'rb')
image_data = image_file.read()
return HttpResponse(image_data, mimetype='image/png')
Django Автоматически выбор Developer или Production версии по имени хоста компьютера
# settings.py
import socket
if socket.gethostname() == 'my-laptop':
DEBUG = TEMPLATE_DEBUG = True
else:
DEBUG = TEMPLATE_DEBUG = False
# ...
import socket
if socket.gethostname() == 'my-laptop':
DEBUG = TEMPLATE_DEBUG = True
else:
DEBUG = TEMPLATE_DEBUG = False
# ...
Python Позиционные и именные (ключевые) аргументы функций (*args и **kwargs))
def foo(*args, **kwargs):
print "Positional arguments are:"
print args
print "Keyword arguments are:"
print kwargs
>>> foo(1, 2, 3)
Positional arguments are:
(1, 2, 3)
Keyword arguments are:
{}
>>> foo(1, 2, name='Adrian', framework='Django')
Positional arguments are:
(1, 2)
Keyword arguments are:
{'framework': 'Django', 'name': 'Adrian'}
print "Positional arguments are:"
print args
print "Keyword arguments are:"
print kwargs
>>> foo(1, 2, 3)
Positional arguments are:
(1, 2, 3)
Keyword arguments are:
{}
>>> foo(1, 2, name='Adrian', framework='Django')
Positional arguments are:
(1, 2)
Keyword arguments are:
{'framework': 'Django', 'name': 'Adrian'}
Django Паттерны
Обработка ошибок а полях формы.
Сначала необходимо создать пустой массив, в котором будут храниться сообщения об ошибках.
Далее в цикле необходимо проверить все значения из полей формы.
Если значение в поле формы введено с ошибкой, то в массив ошибок необходимо добавить описание этой ошибки.
После этого в шаблоне необходимо вывести все сообщения об ошибках из массива ошибок, если они есть.
def contact(request):
errors = []
if not request.POST['subject']:
errors.append('Enter a subject.')
if not request.POST['message']:
errors.append('Enter a message.')
if not request.POST['email']:
errors.append('Enter a valid e-mail address.')
if not errors:
send_mail(
request.POST['subject'],
request.POST['message'],
request.POST.get('email', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
t = loader.get_template('contact_form.html')
c = RequestContext(request, {
'errors': errors,
'subject': request.POST.get('subject', ''),
'message': request.POST.get('message', ''),
'email': request.POST.get('email', ''),
})
renderedTemplate = t.render(c)
return HttpResponse(renderedTemplate)
{% if errors %}
{% for error in errors %}
<p style="color: red;">{{ error }}</p>
{% endfor %}
{% endif %}
Сначала необходимо создать пустой массив, в котором будут храниться сообщения об ошибках.
Далее в цикле необходимо проверить все значения из полей формы.
Если значение в поле формы введено с ошибкой, то в массив ошибок необходимо добавить описание этой ошибки.
После этого в шаблоне необходимо вывести все сообщения об ошибках из массива ошибок, если они есть.
def contact(request):
errors = []
if not request.POST['subject']:
errors.append('Enter a subject.')
if not request.POST['message']:
errors.append('Enter a message.')
if not request.POST['email']:
errors.append('Enter a valid e-mail address.')
if not errors:
send_mail(
request.POST['subject'],
request.POST['message'],
request.POST.get('email', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
t = loader.get_template('contact_form.html')
c = RequestContext(request, {
'errors': errors,
'subject': request.POST.get('subject', ''),
'message': request.POST.get('message', ''),
'email': request.POST.get('email', ''),
})
renderedTemplate = t.render(c)
return HttpResponse(renderedTemplate)
{% if errors %}
{% for error in errors %}
<p style="color: red;">{{ error }}</p>
{% endfor %}
{% endif %}
вторник, 19 февраля 2013 г.
Django Регистрация таблиц базы данных в админке
Файл models.py
from django.db import models
import datetime
# Таблица базы данных и функции для работы над ее данными.
class Poll(models.Model):
question = models.CharField(max_length = 200)
pub_date = models.DateTimeField('date published')
def __unicode__(self):
return self.question
def was_published_today(self):
return self.pub_date.date() == datetime.datetime.today()
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice = models.CharField(max_length = 200)
votes = models.IntegerField()
def __unicode__(self):
return self.choice
Файл admin.py
from models import Poll # Импортирует класс таблицы базы данных.
from django.contrib import admin
class PollAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question'] # Задает порядок расположения полей в админке
admin.site.register(Poll, PollAdmin) # Регистрирует таблицу базы данных для появления в админке.
В результате регистрации класса таблицы Poll базы данных в админке появится пункт меню Polls, который позволит редактировать данные таблицы Polls.
from django.db import models
import datetime
# Таблица базы данных и функции для работы над ее данными.
class Poll(models.Model):
question = models.CharField(max_length = 200)
pub_date = models.DateTimeField('date published')
def __unicode__(self):
return self.question
def was_published_today(self):
return self.pub_date.date() == datetime.datetime.today()
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice = models.CharField(max_length = 200)
votes = models.IntegerField()
def __unicode__(self):
return self.choice
Файл admin.py
from models import Poll # Импортирует класс таблицы базы данных.
from django.contrib import admin
class PollAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question'] # Задает порядок расположения полей в админке
admin.site.register(Poll, PollAdmin) # Регистрирует таблицу базы данных для появления в админке.
В результате регистрации класса таблицы Poll базы данных в админке появится пункт меню Polls, который позволит редактировать данные таблицы Polls.
Django Admin Static files UnicodeDecodeError Windows
Если вы работаете в Windows, используете Python 2.7, Django 1.3 и при загрузке админки по адресу http://127.0.0.1:8000/admin/ не подгружаются стили, а при переходе по адресу http://127.0.0.1:8000/static/admin/css/base.css вы видите внизу страницы сообщение об ошибке:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)
То это означает, что в реестре Windows находятся кирилические символы. Обычно они попадают туда после установки QuickTime.
Баг, описанный в данной статье, касается только Python 2.7, в котором модуль mimetypes стал обращаться к реестру Windows для пополнения собственной базы mime-типов. В предыдущих версиях Python этого не было.
Для устранения данной проблемы вам необходимо нажать в Windows на кнопку Пуск (Start) и выбрать опцию Выполнить (Run).
Далее в появившемся окне введите regedit и нажмите на кнопку OK.
В результате откроется окно редактора реестра Windows.
В этом окне вам необходимо раскрыть последовательность папок
HKEY_CLASSES_ROOT\MIME\Database\Content Type
Внутри папки Content Type в само низу вы найдете папки, имеющие русские буквы в названии, такие как "аудио" и "видео".
Например.
аудио/AMR
аудио/x-gsm
видео/x-m4v
Вы должны удалить эти папки или исправить их названия, заменив русские символы на английские. Например, "audio" и "video".
После этого исправления стили для оформления админки Django станут подгружаться.
(Для тех у кого в registry Windows 7 нет русских символов, но проблема осталась, переименуйте сетевое имя компьютера с русского на английский язык. )
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)
То это означает, что в реестре Windows находятся кирилические символы. Обычно они попадают туда после установки QuickTime.
Баг, описанный в данной статье, касается только Python 2.7, в котором модуль mimetypes стал обращаться к реестру Windows для пополнения собственной базы mime-типов. В предыдущих версиях Python этого не было.
Для устранения данной проблемы вам необходимо нажать в Windows на кнопку Пуск (Start) и выбрать опцию Выполнить (Run).
Далее в появившемся окне введите regedit и нажмите на кнопку OK.
В результате откроется окно редактора реестра Windows.
В этом окне вам необходимо раскрыть последовательность папок
HKEY_CLASSES_ROOT\MIME\Database\Content Type
Внутри папки Content Type в само низу вы найдете папки, имеющие русские буквы в названии, такие как "аудио" и "видео".
Например.
аудио/AMR
аудио/x-gsm
видео/x-m4v
Вы должны удалить эти папки или исправить их названия, заменив русские символы на английские. Например, "audio" и "video".
После этого исправления стили для оформления админки Django станут подгружаться.
(Для тех у кого в registry Windows 7 нет русских символов, но проблема осталась, переименуйте сетевое имя компьютера с русского на английский язык. )
Подписаться на:
Сообщения (Atom)