# In urls.py

urlpatterns = ('myproject.myapp.views',
    url('^(?P<url_key>[a-z0-9]+)/view/$', 'my_view'),
    url('^(?P<url_key>[a-z0-9]+)/write/$', 'my_write'),
    ...
)



# In views.py

# Requires Python 2.5 or higher
from functools import wraps
from django.shortcuts import get_object_or_404
from django.core.exceptions import PermissionDenied

def object_context(view_func):
    @wraps(view_func)
    def decorated(request, url_key, *args, **kwargs):
        # Put your own discovery conditions here.
        instance = get_object_or_404(MyModel, url_key=url_key, is_active=True)
        return view_func(request, instance, *args, **kwargs)
    return decorated

# For those who use granular pemission systems.
def object_perm_required(*perm_names):
    def decorate(view_func):
        @wraps(view_func)
        @object_context
        def decorated(request, instance, *args, **kwargs):
            for perm_name in perm_names:
                # Put your permission check routine here.
                if request.user.has_row_perm(instance, perm_name):
                    break
            else:
                raise PermissionDenied()
            return view_func(request, instance, *args, **kwargs)
        return decorated
    return decorate

@object_context
def my_view(request, instance):
    # do something

@object_permission_required('can_write')
def my_write(request, instance):
    # do something