forgotten labs

Page 2 of 4

Testing django apps with South migrations

Ostatnio zacząłem zgłębiać temat testów w django (napiszę o tym osobny, dłuższy post), ale od razu pojawił się pewien problem. Przy kreowaniu testowej bazy danych nie generowały się tabele dla aplikacji, które miały migracje z South.

DatabaseError: (1146, "Table 'test_db1.users_userprofile' doesn't exist")

.
----------------------------------------------------------------------
Ran 1 test in 1.590s

OK

Jak sobie z tym poradzić?

SOUTH_TESTS_MIGRATE = False

… do settings.py

Dziękuje, dobranoc.

Caught AttributeError while rendering: ‚BlockNode’ object has no attribute ‚context

Być może uratuje komuś kilka(naście) minut z googlania. Błąd z tytułu lubi pojawiać się np. wtedy gdy próbujemy odpalić {{ block.super }} w szablonie, który z niczego nie dziedziczy.

How to authenticate in Django via urllib2?

Let’s say you want to write a python script, using urllib2 to access some @login_required protected typical django website, with django.contrib.auth authentication and default csrf protection.

In order to do this, you have to first login, and then keep the cookie with session id you received. Also, you need to keep in mind that csrf will raise a 403 if you would try to POST to the page without csrf_token in your POST data.

First you have to do some initial setup that will later allow you to use cookies:

import urllib, urllib2
import cookielib

cj = cookielib.CookieJar()

opener = urllib2.build_opener(
    urllib2.HTTPCookieProcessor(cj), 
    urllib2.HTTPHandler(debuglevel=1)
)

HTTPHandler(debuglevel=1) part is actually optional, in this case it would just print more data that you might be interested in (headers mostly).

Now you use your shiny new opener to open a login page and grab a csrf token from it:

from lxml import html
login_form = opener.open(login_url).read()
csrf_token = html.fromstring(login_form).xpath(
    '//input[@name="csrfmiddlewaretoken"]/@value'
)[0]

Then you create dictionary with username, password and newly grabbed token:

# make values dict
values = {
    'username': username,
    'password': password,
    'csrfmiddlewaretoken': csrf_token,
}

# Convert to params
params = urllib.urlencode(values)

Then you can login:

login_page = opener.open(login_url, params)
print login_page.read()

And check out some sites that needs authentication:

staff_page = opener.open(staff_url)
print staff_page.read()

Enjoy!

Overwriting methods with fields in django models.

Jak wszyscy wiemy Django umożliwia dziedziczenie modeli w dodatku na klika sposobów. Jednak ma pewne ograniczenia. Nie można np. nadpisać pola z modelu bazowego nowym polem. Jak czytamy w dokumentacji:

This restriction only applies to attributes which are Field instances. Normal Python attributes can be overridden if you wish. It also only applies to the name of the attribute as Python sees it: if you are manually specifying the database column name, you can have the same column name appearing in both a child and an ancestor model for multi-table inheritance (they are columns in two different database tables).

Jendakże… Co się stanie kiedy będziemy chcieli nadpisać nie pole, a polem? Np. tworząc pole o nazwie takiej samej jak @property z modelu bazowego?

Odpowiedź: Otrzymamy AttributeError. o treści „can’t set attribute”.

Pełne case study dostępne jako ticket na code.djangoproject.com.

Sorting versions in python

Niech g będzie listą stringów wyglądających jak nr wersji jakiegoś pakietu:

g = ["1.1", "1.2", "1.10", "1.6", "1.65", "1.59", "1.23"]

Jak wykorzystując pythona posortować tę listę tak aby otrzymać wersje chronologicznie?

['1.1', '1.2', '1.6', '1.10', '1.23', '1.59', '1.65']

Wykorzystujemy do tego moduł distutils.version:

In [1]: from distutils.version import StrictVersion

In [2]: g = ["1.1", "1.2", "1.10", "1.6", "1.65", "1.59", "1.23"]

In [3]: f = [StrictVersion(x) for x in g]

In [4]: sorted(f)
Out[4]: 
[StrictVersion ('1.1'),
 StrictVersion ('1.2'),
 StrictVersion ('1.6'),
 StrictVersion ('1.10'),
 StrictVersion ('1.23'),
 StrictVersion ('1.59'),
 StrictVersion ('1.65')]

In [5]: [str(x) for x in sorted(f)]
Out[5]: ['1.1', '1.2', '1.6', '1.10', '1.23', '1.59', '1.65']

Szczególne podziękowania dla Restless Being za zwrócenie uwagii na bibliotekę. :)

« Older posts Newer posts »
bbw indian
desi porn hub videos