受到“Hidden features of…”问题系列的启发,我很想听听您所知道的Django技巧或较少人知但实用的功能。
- 每个答案请仅包含一个技巧。
- 如果有要求,请注明Django版本。
受到“Hidden features of…”问题系列的启发,我很想听听您所知道的Django技巧或较少人知但实用的功能。
使用IPython,可以在任何级别上跳转到您的代码,并使用IPython的强大功能进行调试。安装IPython后,只需在想要调试的位置加入以下代码:
from IPython.Shell import IPShellEmbed; IPShellEmbed()()
然后,刷新页面,进入您的运行服务器窗口,您将进入一个交互式IPython窗口。
我在TextMate中设置了一段代码片段,所以我只需键入ipshell并按Tab键即可。我离不开它。
运行一个开发用的SMTP服务器,它将只输出发送到它的所有内容(如果您不想在开发服务器上真正安装SMTP)。
命令行:
python -m smtpd -n -c DebuggingServer localhost:1025
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
,这样会将电子邮件打印到manage.py
输出中。 - vdboor从django-admin文档中得知:
如果您使用Bash shell,请考虑安装Django bash自动补全脚本,该脚本位于Django发行版的extras/django_bash_completion
目录下。它启用了django-admin.py
和manage.py
命令的制表符自动完成功能,这样您就可以:
django-admin.py
。sql
,然后按[Tab]键,以查看所有名称以sql
开头的可用选项。django_extensions附带的./manage.py runserver_plus
功能非常棒。
它创建了一个增强版的调试页面,其中包含使用Werkzeug调试器为堆栈中的每个点创建交互式调试控制台(请参见截图)。此外,它还提供了一个非常有用的便捷调试方法dump()
,可显示有关对象/帧的信息。
要安装,请使用pip:
pip install django_extensions
pip install Werkzeug
然后在settings.py
的INSTALLED_APPS
元组中添加'django_extensions'
,并使用新扩展启动开发服务器:
./manage.py runserver_plus
这将改变您调试的方式。
在尝试在Django和另一个应用程序之间交换数据时,request.raw_post_data
是个好朋友。使用它来接收和自定义处理XML数据等。
文档: http://docs.djangoproject.com/en/dev/ref/request-response/
我喜欢使用Python调试器pdb来调试Django项目。
这是一个有用的链接,可以学习如何使用它:http://www.ferg.org/papers/debugging_in_python.html
在您的视图代码中添加assert False
以转储调试信息。
5 / 0
。为什么是五?不知道。 - JasonSmith这篇回答是关于Django URL命名和反向URL分发的补充。
URL命名也可以在模板中有效地使用。例如,对于给定的URL模式:
url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')
您可以在模板中包含以下内容:
<a href="{% url project_team project.id %}">Team</a>
Django的“视图”只需要是可调用的函数,返回一个HttpResponse就可以了,因此你可以轻松地创建类视图,就像Ruby on Rails和其他框架一样。
有几种创建类视图的方法,以下是我最喜欢的:
from django import http
class RestView(object):
methods = ('GET', 'HEAD')
@classmethod
def dispatch(cls, request, *args, **kwargs):
resource = cls()
if request.method.lower() not in (method.lower() for method in resource.methods):
return http.HttpResponseNotAllowed(resource.methods)
try:
method = getattr(resource, request.method.lower())
except AttributeError:
raise Exception("View method `%s` does not exist." % request.method.lower())
if not callable(method):
raise Exception("View method `%s` is not callable." % request.method.lower())
return method(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
return http.HttpResponse()
def head(self, request, *args, **kwargs):
response = self.get(request, *args, **kwargs)
response.content = ''
return response
你可以在基本视图中添加各种其他内容,例如条件请求处理和授权。
一旦你设置好了你的视图,你的urls.py文件将看起来像这样:
from django.conf.urls.defaults import *
from views import MyRestView
urlpatterns = patterns('',
(r'^restview/', MyRestView.dispatch),
)
ipdb
,然后只需输入ipdb.set_trace()
。 - Tomasz Zieliński