mirror of
https://github.com/django/django.git
synced 2025-07-04 17:59:13 +00:00
Merge to trunk r1307
git-svn-id: http://code.djangoproject.com/svn/django/branches/new-admin@1309 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
commit
2b1c07d216
@ -196,6 +196,7 @@ MIDDLEWARE_CLASSES = (
|
|||||||
SESSION_COOKIE_NAME = 'hotclub' # Cookie name. This can be whatever you want.
|
SESSION_COOKIE_NAME = 'hotclub' # Cookie name. This can be whatever you want.
|
||||||
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # Age of cookie, in seconds (default: 2 weeks).
|
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # Age of cookie, in seconds (default: 2 weeks).
|
||||||
SESSION_COOKIE_DOMAIN = None # A string like ".lawrence.com", or None for standard domain cookie.
|
SESSION_COOKIE_DOMAIN = None # A string like ".lawrence.com", or None for standard domain cookie.
|
||||||
|
SESSION_SAVE_EVERY_REQUEST = False # Whether to save the session data on every request.
|
||||||
|
|
||||||
#########
|
#########
|
||||||
# CACHE #
|
# CACHE #
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from django.conf.settings import SESSION_COOKIE_NAME, SESSION_COOKIE_AGE, SESSION_COOKIE_DOMAIN
|
from django.conf.settings import SESSION_COOKIE_NAME, SESSION_COOKIE_AGE, SESSION_COOKIE_DOMAIN, SESSION_SAVE_EVERY_REQUEST
|
||||||
from django.models.core import sessions
|
from django.models.core import sessions
|
||||||
from django.utils.cache import patch_vary_headers
|
from django.utils.cache import patch_vary_headers
|
||||||
import datetime
|
import datetime
|
||||||
@ -67,7 +67,7 @@ class SessionMiddleware:
|
|||||||
modified = request.session.modified
|
modified = request.session.modified
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
modified = False
|
modified = False
|
||||||
if modified:
|
if modified or SESSION_SAVE_EVERY_REQUEST:
|
||||||
session_key = request.session.session_key or sessions.get_new_session_key()
|
session_key = request.session.session_key or sessions.get_new_session_key()
|
||||||
new_session = sessions.save(session_key, request.session._session,
|
new_session = sessions.save(session_key, request.session._session,
|
||||||
datetime.datetime.now() + datetime.timedelta(seconds=SESSION_COOKIE_AGE))
|
datetime.datetime.now() + datetime.timedelta(seconds=SESSION_COOKIE_AGE))
|
||||||
|
@ -49,10 +49,10 @@ Fields
|
|||||||
and can contain any character.
|
and can contain any character.
|
||||||
* ``is_staff`` -- Boolean. Designates whether this user can access the
|
* ``is_staff`` -- Boolean. Designates whether this user can access the
|
||||||
admin site.
|
admin site.
|
||||||
* ``is_active`` -- Boolean. Designates whether this user account is valid.
|
* ``is_active`` -- Boolean. Designates whether this user can log into the
|
||||||
Set this to ``False`` instead of deleting accounts.
|
Django admin. Set this to ``False`` instead of deleting accounts.
|
||||||
* ``is_superuser`` -- Boolean. Designates whether this user has permission
|
* ``is_superuser`` -- Boolean. Designates that this user has all permissions
|
||||||
to do anything (according to the permission system).
|
without explicitly assigning them.
|
||||||
* ``last_login`` -- A datetime of the user's last login. Is set to the
|
* ``last_login`` -- A datetime of the user's last login. Is set to the
|
||||||
current date/time by default.
|
current date/time by default.
|
||||||
* ``date_joined`` -- A datetime designating when the account was created.
|
* ``date_joined`` -- A datetime designating when the account was created.
|
||||||
@ -93,10 +93,11 @@ methods:
|
|||||||
the user has, both through group and user permissions.
|
the user has, both through group and user permissions.
|
||||||
|
|
||||||
* ``has_perm(perm)`` -- Returns ``True`` if the user has the specified
|
* ``has_perm(perm)`` -- Returns ``True`` if the user has the specified
|
||||||
permission.
|
permission, where perm is in the format ``"package.codename"``.
|
||||||
|
|
||||||
* ``has_perms(perm_list)`` -- Returns ``True`` if the user has each of the
|
* ``has_perms(perm_list)`` -- Returns ``True`` if the user has each of the
|
||||||
specified permissions.
|
specified permissions, where each perm is in the format
|
||||||
|
``"package.codename"``.
|
||||||
|
|
||||||
* ``has_module_perms(package_name)`` -- Returns ``True`` if the user has
|
* ``has_module_perms(package_name)`` -- Returns ``True`` if the user has
|
||||||
any permissions in the given package (the Django app label).
|
any permissions in the given package (the Django app label).
|
||||||
@ -274,6 +275,14 @@ As a shortcut, you can use the convenient ``user_passes_test`` decorator::
|
|||||||
|
|
||||||
from django.views.decorators.auth import user_passes_test
|
from django.views.decorators.auth import user_passes_test
|
||||||
|
|
||||||
|
def my_view(request):
|
||||||
|
# ...
|
||||||
|
my_view = user_passes_test(my_view, lambda u: u.has_perm('polls.can_vote'))
|
||||||
|
|
||||||
|
Here's the same thing, using Python 2.4's decorator syntax::
|
||||||
|
|
||||||
|
from django.views.decorators.auth import user_passes_test
|
||||||
|
|
||||||
@user_passes_test(lambda u: u.has_perm('polls.can_vote'))
|
@user_passes_test(lambda u: u.has_perm('polls.can_vote'))
|
||||||
def my_view(request):
|
def my_view(request):
|
||||||
# ...
|
# ...
|
||||||
|
@ -963,6 +963,13 @@ Now, every ``Pizza`` object will have a ``is_disgusting()`` method.
|
|||||||
|
|
||||||
Note that the scope of custom methods is modified to be the same as the module
|
Note that the scope of custom methods is modified to be the same as the module
|
||||||
scope. These methods do NOT have access to globals within your model's module.
|
scope. These methods do NOT have access to globals within your model's module.
|
||||||
|
Additionally, custom methods have access to a few commonly-used objects for
|
||||||
|
convenience:
|
||||||
|
|
||||||
|
* The ``datetime`` module from Python's standard library.
|
||||||
|
* The ``db`` object from ``django.core.db``. This represents the database
|
||||||
|
connection, so you can do custom queries via a cursor object. See
|
||||||
|
"Executing custom SQL" below.
|
||||||
|
|
||||||
See `Giving models custom methods`_ for a full example.
|
See `Giving models custom methods`_ for a full example.
|
||||||
|
|
||||||
@ -1056,6 +1063,39 @@ method that begins with "validate"::
|
|||||||
if int(field_data) in BAD_CUSTOMER_IDS:
|
if int(field_data) in BAD_CUSTOMER_IDS:
|
||||||
raise validators.ValidationError, "We don't deliver to this customer."
|
raise validators.ValidationError, "We don't deliver to this customer."
|
||||||
|
|
||||||
|
Executing custom SQL
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Feel free to write custom SQL statements in custom model methods and
|
||||||
|
module-level methods. Each custom method automatically has access to the
|
||||||
|
variable ``db``, which is the current database connection. To use it, call
|
||||||
|
``db.cursor()`` to get a cursor object. Then, call ``cursor.execute(sql, [params])``
|
||||||
|
to execute the SQL and ``cursor.fetchone()`` or ``cursor.fetchall()`` to return
|
||||||
|
the resulting rows. Example::
|
||||||
|
|
||||||
|
def my_custom_sql(self):
|
||||||
|
cursor = db.cursor()
|
||||||
|
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
|
||||||
|
row = cursor.fetchone()
|
||||||
|
return row
|
||||||
|
|
||||||
|
If your custom SQL statement alters the data in your database -- for example,
|
||||||
|
via a ``DELETE`` or ``UPDATE`` -- you'll need to call ``db.commit()``. Example::
|
||||||
|
|
||||||
|
def my_custom_sql2(self):
|
||||||
|
cursor = db.cursor()
|
||||||
|
cursor.execute("DELETE FROM bar WHERE baz = %s", [self.baz])
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
``db`` and ``cursor`` simply use the standard `Python DB-API`_. If you're not
|
||||||
|
familiar with the Python DB-API, note that the SQL statement in
|
||||||
|
``cursor.execute()`` uses placeholders, ``"%s"``, rather than adding parameters
|
||||||
|
directly within the SQL. If you use this technique, the underlying database
|
||||||
|
library will automatically add quotes and escaping to your parameter(s) as
|
||||||
|
necessary.
|
||||||
|
|
||||||
|
.. _Python DB-API: http://www.python.org/peps/pep-0249.html
|
||||||
|
|
||||||
Using models
|
Using models
|
||||||
============
|
============
|
||||||
|
|
||||||
|
@ -41,7 +41,8 @@ It implements the following standard dictionary methods:
|
|||||||
Example: ``request.session['fav_color'] = 'blue'``
|
Example: ``request.session['fav_color'] = 'blue'``
|
||||||
|
|
||||||
* ``__delitem__(key)``
|
* ``__delitem__(key)``
|
||||||
Example: ``del request.session['fav_color']``
|
Example: ``del request.session['fav_color']``. This raises ``KeyError``
|
||||||
|
if the given ``key`` isn't already in the session.
|
||||||
|
|
||||||
* ``get(key, default=None)``
|
* ``get(key, default=None)``
|
||||||
Example: ``fav_color = request.session.get('fav_color', 'red')``
|
Example: ``fav_color = request.session.get('fav_color', 'red')``
|
||||||
@ -158,10 +159,42 @@ This is necessary because the dictionary is stored in an encoded format::
|
|||||||
>>> s.get_decoded()
|
>>> s.get_decoded()
|
||||||
{'user_id': 42}
|
{'user_id': 42}
|
||||||
|
|
||||||
Session cookies
|
When sessions are saved
|
||||||
===============
|
=======================
|
||||||
|
|
||||||
A few `Django settings`_ give you control over the session cookie:
|
By default, Django only saves to the session database when the session has been
|
||||||
|
modified -- that is if any of its dictionary values have been assigned or
|
||||||
|
deleted::
|
||||||
|
|
||||||
|
# Session is modified.
|
||||||
|
request.session['foo'] = 'bar'
|
||||||
|
|
||||||
|
# Session is modified.
|
||||||
|
del request.session['foo']
|
||||||
|
|
||||||
|
# Session is modified.
|
||||||
|
request.session['foo'] = {}
|
||||||
|
|
||||||
|
# Gotcha: Session is NOT modified, because this alters
|
||||||
|
# request.session['foo'] instead of request.session.
|
||||||
|
request.session['foo']['bar'] = 'baz'
|
||||||
|
|
||||||
|
**Only available in Django development version.** To change this default
|
||||||
|
behavior, set the ``SESSION_SAVE_EVERY_REQUEST`` setting to ``True``. If
|
||||||
|
``SESSION_SAVE_EVERY_REQUEST`` is ``True``, Django will save the session to the
|
||||||
|
database on every single request.
|
||||||
|
|
||||||
|
Note that the session cookie is only sent when a session has been created or
|
||||||
|
modified. If ``SESSION_SAVE_EVERY_REQUEST`` is ``True``, the session cookie
|
||||||
|
will be sent on every request.
|
||||||
|
|
||||||
|
Similarly, the ``expires`` part of a session cookie is updated each time the
|
||||||
|
session cookie is sent.
|
||||||
|
|
||||||
|
Settings
|
||||||
|
========
|
||||||
|
|
||||||
|
A few `Django settings`_ give you control over session behavior:
|
||||||
|
|
||||||
SESSION_COOKIE_AGE
|
SESSION_COOKIE_AGE
|
||||||
------------------
|
------------------
|
||||||
@ -189,6 +222,17 @@ The name of the cookie to use for sessions. This can be whatever you want.
|
|||||||
``'hotclub'`` is a reference to the Hot Club of France, the band Django
|
``'hotclub'`` is a reference to the Hot Club of France, the band Django
|
||||||
Reinhardt played in.
|
Reinhardt played in.
|
||||||
|
|
||||||
|
SESSION_SAVE_EVERY_REQUEST
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Default: ``False``
|
||||||
|
|
||||||
|
**Only available in Django development version.**
|
||||||
|
|
||||||
|
Whether to save the session data on every request. If this is ``False``
|
||||||
|
(default), then the session data will only be saved if it has been modified --
|
||||||
|
that is, if any of its dictionary values have been assigned or deleted.
|
||||||
|
|
||||||
.. _Django settings: http://www.djangoproject.com/documentation/settings/
|
.. _Django settings: http://www.djangoproject.com/documentation/settings/
|
||||||
|
|
||||||
Technical details
|
Technical details
|
||||||
|
@ -533,6 +533,13 @@ See the `session docs`_.
|
|||||||
``'hotclub'`` is a reference to the Hot Club of France, the band Django
|
``'hotclub'`` is a reference to the Hot Club of France, the band Django
|
||||||
Reinhardt played in.
|
Reinhardt played in.
|
||||||
|
|
||||||
|
SESSION_SAVE_EVERY_REQUEST
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Default: ``False``
|
||||||
|
|
||||||
|
Whether to save the session data on every request. See the `session docs`_.
|
||||||
|
|
||||||
SITE_ID
|
SITE_ID
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ activate the admin site for your installation, do these three things:
|
|||||||
* Add ``"django.contrib.admin"`` to your ``INSTALLED_APPS`` setting.
|
* Add ``"django.contrib.admin"`` to your ``INSTALLED_APPS`` setting.
|
||||||
* Run the command ``django-admin.py install admin``. This will create an
|
* Run the command ``django-admin.py install admin``. This will create an
|
||||||
extra database table that the admin needs.
|
extra database table that the admin needs.
|
||||||
* Edit your ``myproject.urls`` file and uncomment the line below
|
* Edit your ``myproject/urls.py`` file and uncomment the line below
|
||||||
"Uncomment this for admin:". This file is a URLconf; we'll dig into
|
"Uncomment this for admin:". This file is a URLconf; we'll dig into
|
||||||
URLconfs in the next tutorial. For now, all you need to know is that it
|
URLconfs in the next tutorial. For now, all you need to know is that it
|
||||||
maps URL roots to applications.
|
maps URL roots to applications.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user