django-mfw
is a framework for developping mobile site with Django. The following feature is available
- Detect accessing device via HTTP_USER_AGENT and determine the device can handle cookie or not.
- Non cookie based Session and Csrf protection for the devices which cannot handle cookies.
- Dynamically change loading template via the device information. That's mean you can prepare the HTML template for each device (flavour template system)
- Encode request and response via detected device encoding. It is required because some Japanese mobile phone cannot handle UTF-8
- Translate Japanese Emoji in request and response to proper character code or image for PC.
Note
This is under development. The codes below may not work.
sudo pip install django-mfw
or:
sudo pip install git+git://github.com/lambdalisue/django-mfw.git#egg=django-mfw
- e4u (emoji4unicode bundle framework)
- Add
mfw
andmfw.contrib.emoji
to yourINSTALL_APPS
settings insettings.py
Add
mfw.middleware.device.RequestDeviceDetectionMiddleware
to the first item ofMIDDLEWARE_CLASSES
insettings.py
andmfw.middleware.device.ResponseDeviceDetectionMiddleware
to the last item ofNote
The following django-mfw middlewares are assumed that this middleware has called before they are called.
- Add
mfw.middleware.session.SessionMiddleware
andmfw.middleware.csrf.CsrfViewMiddleware
to yourMIDDLEWARE_CLASSES
setting and comment out existing middlewares. - Add
mfw.contrib.emoji.middleware.DeviceEmojiTranslationMiddleware
andmfw.middleware.flavour.DeviceFlavourDetectionMiddleware
to yourMIDDLEWARE_CLASSES
setting. - Add
mfw.template.loaders.flavour.Loader
to the first item ofTEMPLATE_LOADERS
setting. - Add
mfw.context_processors.device
andmfw.context_processors.flavour
to yourTEMPLATE_CONTEXT_PROCESSORS
setting.
The code below describe sample settings. See settings.py for more detail.:
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'mfw.template.loaders.flavour.Loader',
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
MIDDLEWARE_CLASSES = (
'mfw.middleware.device.RequestDeviceDetectionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.contrib.sessions.middleware.SessionMiddleware',
'mfw.middleware.session.SessionMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'mfw.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'mfw.contrib.emoji.middleware.DeviceEmojiTranslationMiddleware',
'mfw.middleware.flavour.DeviceFlavourDetectionMiddleware',
'mfw.middleware.device.ResponseDeviceDetectionMiddleware',
)
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.request",
"mfw.context_processors.device",
"mfw.context_processors.flavour",
)
request device is detected with mfw.middleware.device.DeviceDetectionMiddleware
and stored in request.device
the device
instance has following attributes
device.support_cookie
is the device support cookie or not.
device.kind
A kind of this device. It is used for flavour template system.
device.name
A name of this device. It is used for flavour template system.
device.model
A model name of this device. It is used for flavour template system.
device.version
A version name of this device. It is used for flavour template system.
device.encoding
A recommended encoding for the device. It is used to encode the request/response
device.carrier (additional)
An attribute which Mobilephone device has. the carrier name of the device.
device.uid (additional)
An attribute which Mobilephone device has. User id which is passed from carrier server.
device.reliable (additional)
An attribute which Mobilephone device has. If
False
then the HTTP_USER_AGENT might be modified thus passed user id is not reliable enough.
Django default session is saved on cookie because of security reason. However some device doesn't support cookie so mfw.middleware.session.SessionMiddleware
use carrier's UID and django cache system for saving session.
the middleware never try to use carrier's UID for device which support cookie. it is only for the device which doesn't support cookie and commonly such device has carrier's UID. Because of security, device accessed from out of carrier's CIDR is not trusted so it cannot save session if cookie is not supported.
Note
To accept non cookie based session for the device accessed from out of carrier's CIDR, set MFW_IGNORE_NON_RELIABLE_MOBILE
to False
but IT IS STRONGLY NOT RECOMMENDED
mfw.contrib.emoji.middleware.DeviceEmojiTranslationMiddleware
care it. it detect device and automatically translate unicode emoji to carrier's encoded emoji in response. That's why you do not need to care the code of emoji. Just write emoji as unicode emoji then middleware translate everything correctly and encode response to carrier's encoding
Incoming translation is also handled the middleware. if request.GET
or request.POST
has carrier emoji, the middleware automatically translate the carrier emojis to unicode emojis and decode value to unicode.
Unicode emoji is found on http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html . this is a part of emoji4unicode project and translation method is using conversion table of it. see e4u for more detail.
mfw.middleware.flavour.DeviceFlavourDetectionMiddleware
detect device and automatically create flavour for device. the flavour is used for prefix of template_name. so if the flavour is smartphone/iphone/1.3
and called template name is blogs/post_detail.html
then mfw.template.loaders.flavour.Loader
will try to load the file listed below with template loaders listed in TEMPLATE_LOADERS
except oneself.
TEMPLATE_DIRECTORY/smartphone/iphone/1.3/blogs/post_detail.html
TEMPLATE_DIRECTORY/smartphone/iphone/blogs/post_detail.html
TEMPLATE_DIRECTORY/smartphone/blogs/post_detail.html
TEMPLATE_DIRECTORY/blogs/post_detail.html
mfw.template.loaders.flavour.Loader
is bundle loader and loading method is depended with template loaders listed in TEMPLATE_LOADERS
so make sure you listed correct template loader in TEMPLATE_LOADERS
django-mfw's concept is inspired by django-bpmobile django-mobile and emoji4unicode