quinta-feira, 28 de abril de 2011

Migrando para versão 1.3 - parte 3 - o CSRF

O CSRF é uma melhoria que vem desde da versão 1.2.X, impedindo que POSTs externos enviem informações para seu site. Ele protege os forms através de uma chave critptografada que é validada no envio do form.

Para migrar seus forms ( contato / cadastro / login / etc) para suportar o CSRF é necessário alguns passos:


  1. Certifique-se que os middlewares do crsf estejam no settings, confome a parte 1 deste tutorial (http://djangoweb.blogspot.com/2011/04/migrando-para-versao-13-parte-1-o.html)

  2. Coloque no seu form, a tag para geração do token do CSRF:
    {% csrf_token %}

  3. Na view que receberá o POST, valide o token enviado pelo form da seguinte forma:
    from django.core.context_processors import csrf
    c = {}
    c.update(csrf(request))


  4. Caso precise excluir uma view dessa validação, como quando recebe-se o post de terceiros, por exemplo, basta utilizar o decorator @csrf_exempt:

    from django.views.decorators.csrf import csrf_exempt
    @csrf_exempt
    def sua_view_aqui(request):

         
    pass


Nota: para requisições ajax, o token também deverá ser passado.

hasta!

Migrando para versão 1.3 - parte 2 - O urls.py

No arquivo urls.py a mudança é sutil.
Apenas vertifique-se de colocar a linha abaixo antes das urls:

from django.conf.urls.defaults import patterns, include, url


Para importar outros arquivos urls.py ( de aplicações por exemplo ), a sintaxe é assim:

(r'^sua-url/', include('sua-app.urls')),

Migrando para versão 1.3 - parte 1 - O settings.py

Para adequar os projetos desenvolvidos em versões anteriores para a 1.3, foi preciso alguns ajustes no settings

A setting DATABASE agora é um dicionário com as informações de conexão do banco. Deixe-a da seguinte forma:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'pub6l_db',
'USER': 'pub6l_usr',
'PASSWORD': '3f8ezxegmx',
'HOST': '',
'PORT': '',
}
}


Adicione as settings para os arquivos estáticos :

STATIC_ROOT = ''
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/static/admin/'
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)


Na setting MIDDLEWARE_CLASSES, certifique-se que tenha todas as linhas abaixo:

'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',


Verifique também se a setting INSTALLED_APPS contém todas as linhas abaixo (além das suas aplicações claro):  

'django.contrib.auth', 
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',

hasta!



quarta-feira, 27 de abril de 2011

WSGIRequest object has no attribute page

Problema identificado pela falta do middleware do django-pagination.

Coloque a linha abaixo na setting MIDDLEWARE_CLASSES:
'pagination.middleware.PaginationMiddleware',


hasta!

terça-feira, 19 de abril de 2011

Matando a sessão de um usuário remotamente

Hoje presenciei uma nova necessidade. Precisava deslogar um usuário/cliente a partir da administração. Como de costume, no Django não é muito complicado. Tenho uma aplicação de acesso que recebe uma entrada contendo qual é o cliente, hora de acesso e a chave da session gerada para ele.
Gravo na coluna sessão a session_key no ato do login,  que pode ser obtida assim:

request.session.session_key

E para deslogar o usuário, basta fazer isso em alguma view:


from django.contrib.sessions.backends.db import SessionStore
s = SessionStore(session_key=skey)
s.delete()


hasta!