вторник, 26 февраля 2013 г.

Django Basic Auth Middleware

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
)

четверг, 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 обратно в окно браузера, то кнопка пропадает и нужно проводить данную процедуру еще раз.

среда, 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:
   ...

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.')

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

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

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')

Django Автоматически выбор Developer или Production версии по имени хоста компьютера

# settings.py

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'}

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 %}

вторник, 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.

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 нет русских символов, но проблема осталась, переименуйте сетевое имя компьютера с русского на английский язык. )