Mein Blog...
- ↓ Pydev Extensions sind jetzt Open Source!
- ↓ Debugging Django in Produktiver Umgebung...
- ↓ NFS mount in fstab will nicht.
- ↓ django: unique_together mit many-to-many Feldern
- ↓ PyLucid v0.9 öffentliche Testseite, online.
- ↓ django TEMPLATE_STRING_IF_INVALID im admin
- ↓ django template: rekusive Darstellung...
- ↓ SiteMap.html
- ↓ SiteMap_items.html
- ↓ VirtualBox: Dienst nach außen anbieten...
- ↓ Thunderbird - MoreFunctionsForAddressBook
- ↓ django: unique_together menuell überprüfen.
- ↓ siehe auch
Inhaltsverzeichnis
↑ Debugging Django in Produktiver Umgebung... #
Vor 12 Monate veröffentlicht, durch jens.Eine nette Idee: Per middleware nur bestimmten Superuser einen Traceback vorsetzten:
http://www.djangosnippets.org/snippets/1719/
Wäre was für django-tools.
EDIT: IMHO gefällt mir die ursprüngliche Idee von Eric Holscher besser:
1 2 3 4 5 6 7 8 | from django.views.debug import technical_500_response import sys from django.conf import settings class UserBasedExceptionMiddleware(object): def process_exception(self, request, exception): if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS: return technical_500_response(request, *sys.exc_info()) |
von http://ericholscher.com/blog/2008/nov/15/debugging-django-production-environments/
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ NFS mount in fstab will nicht. #
Vor 1 Jahr veröffentlicht, durch jens.Unter Ubuntu 9.04 hab ich in der fstab einen NFS Eintrag hinzugefügt, mit der Option "auto". Dennoch wird nach dem booten kein mount gemacht :(
Ein mount -a in Terminal funktioniert allerdings ohne Probleme.
Vielleicht liegt es ja an den gemeldeten Bug: nfs mounts specified in fstab is not mounted on boot.
Tipp: Als work-a-round hab ich einfach in /etc/rc.local ein mount -a eingetragen ;)
Siehe auch: http://forum.ubuntuusers.de/topic/nfs-in-fstab-mountet-nicht-nach-boot/
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ django: unique_together mit many-to-many Feldern #
Vor 1 Jahr veröffentlicht, durch jens.Noch kann man im model kein unique_together mit many-to-many Feldern machen. Deswegen hab ich da was gehackt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class MyModel(models.Model): site = models.ManyToManyField(Site) on_site = CurrentSiteManager() foobar = ... # A unique field def save(self, *args, **kwargs): if self.id == None: # new item should be created. # manually check a unique togeher, because django can't do this with a M2M field. # Obsolete if unique_together work with ManyToMany: http://code.djangoproject.com/ticket/702 exist = MyModel.on_site.filter(foobar=self.foobar).count() if exist != 0: from django.db import IntegrityError # We can use attributes from this model instance, because it needs to have a primary key # value before a many-to-many relationship can be used. site = Site.objects.get_current() raise IntegrityError( "MyModel item with same foobar field exist on site %r" % site ) return super(MyModel, self).save(*args, **kwargs) class Meta: #unique_together = ("foobar", "site") # unique_together doesn't work with ManyToMany! # See: http://code.djangoproject.com/ticket/702 |
Nicht schon, das ein Traceback mit IntegrityError geworfen wird, aber wenigstens kann man verhindern das die Daten gespeichert werden ;)
Crosspost: http://www.djangosnippets.org/snippets/1676/
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ PyLucid v0.9 öffentliche Testseite, online. #
Vor 1 Jahr, 1 Monat veröffentlicht, durch jens.Es gibt eine öffentliche Testseite, der aktuellen alpha version von PyLucid v0.9:
Ihr könnt es selber ausprobieren. Einfach einloggen als superuser:
- Username: test
- Password: 12345678
Einfach einloggen und ein wenig spielen. Wir resetten die Seite hin und wieder.
Hinweis: Die Seite läuft erstmal nur mit CGI und komplett ohne Caching. Die Perfomance ist somit schlecht.
Feedback willkommen, siehe: Kontakt Seite (en).
Wer selber eine eigene Test Umgebung bauen möchte, sollte sich die Seiten ansehen:
- v0.9 testing (en)
- test v0.9 with CGI (en)
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ django TEMPLATE_STRING_IF_INVALID im admin #
Vor 1 Jahr, 1 Monat veröffentlicht, durch jens.Eigentlich sagt die django Doku, man darf settings.TEMPLATE_STRING_IF_INVALID nur für's debugging nutzten, siehe auch: http://docs.djangoproject.com/en/dev/ref/templates/api/#how-invalid-variables-are-handled
Einige Sachen im Admin Panel sind nämlich mit einem gesetzten Wert kaputt. Das ist bekannt: http://code.djangoproject.com/ticket/3579
Ich halte es für eine schlechte Idee TEMPLATE_STRING_IF_INVALID deswegen generell nie zu benutzten. So sieht man "Fehler" schlechter.
Damit das django admin Panel aber nicht ganz so defekt ist, nutzte ich den Patch:
1 2 3 4 5 6 7 8 9 10 11 12 13 | if settings.TEMPLATE_STRING_IF_INVALID != "": from django.contrib.auth import admin as auth_admin from django.contrib.admin import options def patched_render_to_response(*args, **kwargs): old = settings.TEMPLATE_STRING_IF_INVALID settings.TEMPLATE_STRING_IF_INVALID = "" result = render_to_response(*args, **kwargs) settings.TEMPLATE_STRING_IF_INVALID = old return result options.render_to_response = patched_render_to_response auth_admin.render_to_response = patched_render_to_response |
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ django template: rekusive Darstellung... #
Vor 1 Jahr, 1 Monat veröffentlicht, durch jens.Eine Lösung um rekusive Daten mit der django Template engine darzustellen, ist die Aufteilung in zwei Template Dateien und das einbinden per include. Ein Beispiel:
↑ SiteMap.html #
1 2 | <h1>SiteMap</h1> {% include "SiteMap_items.html" %} |
↑ SiteMap_items.html #
1 2 3 | <ul>
{% for node in nodes %}
|
Update:
Hab SiteMap_items.html geändert. Denn ganz wichtig: der Dateiname muß bei include als Variable übergeben werden. Ansonsten bekommt man eine Endlosschleife! Das dumme ist, man sieht es nur bei settings.TEMPLATE_DEBUG == True ansonsten wird nur eine warnings ausgelöst!
Update2:
Noch ein Hacken gibt es. Weil man den Dateinamen als Variable übergibt, wird das angegebene Template neu geladen. Somit verursacht das ganze einen recht großen Mehraufwand, der eigentlich unnötig ist. Das habe ich daran gemerkt, das dbtemplate sehr viele Datenbank Abfragen verursacht. Allerdings habe ich dafür ein Ticket geöffnet, denn durch einfaches Caching kann man zusätzliche DB Abfragen vermeiden. Außerdem sollte man das normale dbtemplates caching aktivieren.
Siehe auch:
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ VirtualBox: Dienst nach außen anbieten... #
Vor 1 Jahr, 1 Monat veröffentlicht, durch jens.Wenn an keine Lust hat eine Netzwerk Brücke einzurichten, kann auch prima per NAT und Port-Weiterleitung arbeiten. Ist recht leicht einzurichten. Ein Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/bin/bash function verbose_eval { echo $* eval $* } function add_port_forward { echo Try to remove old values for $1 $2 verbose_eval VBoxManage --nologo setextradata "$1" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$2/Protocol" verbose_eval VBoxManage --nologo setextradata "$1" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$2/GuestPort" verbose_eval VBoxManage --nologo setextradata "$1" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$2/HostPort" echo --------------------------------------------------------------------- echo Add for $1 $2 verbose_eval VBoxManage --nologo setextradata "$1" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$2/Protocol" "$3" verbose_eval VBoxManage --nologo setextradata "$1" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$2/GuestPort" $4 verbose_eval VBoxManage --nologo setextradata "$1" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$2/HostPort" $5 echo --------------------------------------------------------------------- echo Please check: verbose_eval VBoxManage --nologo getextradata "$1" enumerate | grep $2 echo --------------------------------------------------------------------- } add_port_forward VM_NAME apache TCP 80 8080 add_port_forward VM_NAME SSH TCP 22 8081 |
Somit sind Webserver (Port 80) und SSH (Port 22) auf dem Host auf Port 8080 bzw. 8081 erreichbar. "VM_NAME" muß natürlich angepasst werden ;)
Weitere Info's: http://wiki.ubuntuusers.de/VirtualBox/Netzwerk#Portweiterleitung
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ Thunderbird - MoreFunctionsForAddressBook #
Vor 1 Jahr, 1 Monat veröffentlicht, durch jens.MoreFunctionsForAddressBook ist eine nette Erweiterung für das Adressbuch von Thunderbird. Damit kann man u.a. vCard (.vcf Dateien) einlesen.
(Last update: 20. Nov. 2009, 11:01 by jens.)
↑ django: unique_together menuell überprüfen. #
Vor 1 Jahr, 1 Monat veröffentlicht, durch jens.Im django model kann man unique-together nutzten:
http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together
Jedoch ist das Datenbank abhängig, ob es auch zu einem Fehler kommt, wenn doppelte Einträge erzeugt werden.
Nun habe ich mir ein signal handler gebaut, der es manuell überprüft:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | def check_unique_together(sender, **kwargs): """ Check models unique_together manually. Django enforced unique together only the database level, but some databases (e.g. SQLite) doesn't support this. usage: from django.db.models import signals signals.pre_save.connect(check_unique_together, sender=MyModelClass) or use auto_add_check_unique_together(), see below """ instance = kwargs["instance"] for field_names in sender._meta.unique_together: model_kwargs = {} for field_name in field_names: try: data = getattr(instance, field_name) except FieldDoesNotExist: # e.g.: a missing field, which is however necessary. # The real exception on model creation should be raised. continue model_kwargs[field_name] = data query_set = sender.objects.filter(**model_kwargs) if instance.pk != None: # Exclude the instance if it was saved in the past query_set = query_set.exclude(pk=instance.pk) count = query_set.count() if count > 0: field_names = get_text_list(field_names, _('and')) msg = _(u"%(model_name)s with this %(field_names)s already exists.") % { 'model_name': unicode(instance.__class__.__name__), 'field_names': unicode(field_names) } raise IntegrityError(msg) |
Es wäre ja eigentlich unsinnig den zu benutzten, wenn die DB es selber kann. Deswegen hab ich sowas gemacht:
1 2 3 4 5 6 | def auto_add_check_unique_together(model_class): """ Add only the signal handler check_unique_together, if a database without UNIQUE support is used. """ if settings.DATABASE_ENGINE in ('sqlite3',): # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. signals.pre_save.connect(check_unique_together, sender=model_class) |
Ich Frage mich allerdings, welche DB's es können und welche nicht. Bei SQLite geht es offensichtlich nicht.
In connection.features ist keine Angabe darüber erhalten. Wie komme ich an die Info's aus django herran?
↑ siehe auch #
Das ganze wird sich auch im Projekt http://code.google.com/p/django-tools/ wieder finden ;)
(Last update: 20. Nov. 2009, 11:01 by jens.)
- /en/Blog/feed/feed.atom ( Atom Syndication Format v1.0 )
- /en/Blog/feed/feed.rss ( Really Simple Syndication v2.01rev2 )