Django需要注意的10个要点

Django的安全防护-Django在安全问题上的处理详解 跨站脚本 (XSS) 防护¶XSS攻击允许用户注入客户端脚本到其他用户的浏览器里。 这通常是通过存储在数据库中的恶意脚本,它将检索并显示给其他用户,或者通过让用户点击一个链接,这将导致攻击者的 JavaScript 被用户的浏览器执行。 然而,XSS 攻击可以来自任何不受信任的源数据,如 Cookie 或 Web 服务,任何没有经过充分处理就包含在网页中的数据。使用 Django 模板保护你免受多数 阅读详情

 

1,不要将项目名称包含在引用代码里

 

比如你创建了一个名为"project"的项目,包含一个名为"app"的应用,那么如下代码是不好的:

 

Python代码 
  1. from project.app.models import Author  

 

缺点在于:应用和项目变成了紧耦合,无法将应用轻易变得可重用。如果将来要换一个项目名称,那你可有得受了。

 

推荐的做法是:

 

Python代码 
  1. from app.models import Author  

 

请注意,你需要将项目的路径配置在PYTHONPATH中。

 

2,不要硬编码MEDIA_ROOT和TEMPLATE_DIRS

 

项目配置文件settings.py中不要使用如下代码:

 

Python代码 
  1. TEMPLATE_DIRS = ( "/home/html/project/templates",)  
  2. MEDIA_ROOT = "/home/html/project/appmedia/"   

 

当你在部署到生产环境,或者迁移服务器的时候,就会发生问题。

 

推荐使用如下方式:

 

Python代码 
  1. SITE_ROOT = os.path.realpath(os.path.dirname(__file__))  
  2. MEDIA_ROOT = os.path.join(SITE_ROOT, 'appmedia')  
  3. TEMPLATE_DIRS = ( os.path.join(SITE_ROOT, 'templates'),)  
 

(也可以使用abspath,跟realpath的区别请参考http://rob.cogit8.org/blog/2009/May/05/django-and-relativity-updated/ )

 

3,不要将静态文件的路径硬编码在模板中

 

模板中链接CSS,javascript或图片的时候,不建议使用如下方式:

 

Html代码 
  1. <link rel="stylesheet" type="text/css" href="/appmedia/amazing.css" />  
  2. <script type="text/javascript" src="/appmedia/jquery.min.js"></script>  
 

当你的项目需要将静态文件用其他服务器提供的时候,通常会是另外一个http地址,那么你就得把所有的/appmedia/替换成新的地址,做网站写代码已经够乏味的了。

 

没有后顾之忧的解决方法是使用{{ MEDIA_URL }}代替硬编码的路径:

 

Html代码 
  1. <link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}amazing.css" />  
  2. <script type="text/javascript" src="{{ MEDIA_URL }}jquery.min.js"></script>  
 

模板上下文变量怎么获取到呢?请使用RequestContext即可:

 

Python代码 
  1. return render_to_response("app/template.html", {'var': 'foo'},  
  2. context_instance=RequestContext(request))  
 

从RequestContext里还可以获取到当前用户等信息,更详细的介绍请参考:http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

 

4,不要将业务逻辑代码写到视图里

 

不要迷惑,虽然你可能看过很多书和例子,它们把逻辑都写在了views.py里,但请你别这么做。因为这样不利于单元测试,不利于重用代码。

 

那我的业务逻辑应该放哪里呢?推荐放到模型里或者单独建立一个辅助(helper)模块。

 

当然,从模型得到一个Author,获取Author列表的代码是可以放到视图里面的。

 

5,部署时别忘记将DEBUG设置成False

 

我们常常忘记在部署时禁用DEBUG,有很多种方法自动来处理这个配置:

 

Python代码 
  1. import socket  
  2.   
  3. if socket.gethostname() == 'productionserver.com':  
  4.     DEBUG = False  
  5. else:  
  6.     DEBUG = True   

 

此方法请参考:http://nicksergeant.com/blog/django/automatically-setting-debug-your-django-app-based-server-hostname

 

另一种途径是使用不同的配置文件:

 

Python代码 
  1. #文件名:settings_debuy.py  
  2. #包含调试模式的配置信息  
  3. #使用python manage.py runserver settings=settings_debug.py来运行项目  
  4.   
  5. from settings import *  
  6.   
  7. DEBUG = True  
  8.   
  9. #还可以配置更多在调试时使用的变量:)  
 

此方法请参考:http://blog.dpeepul.com/2009/07/02/from-now-you-will-never-forget-to-put-debug-true-in-django-production-environment/

 

6,只加载一次自定义的模板标签

 

当需要使用自定义或者第三方的模板标签和模板过滤器时,通常要在模板中使用:

 

Python代码 
  1. {% load template_tags %}  
 

实际情况是,需要在所有用到自定义模板标签和模板过滤器的模板中都使用上面的代码,这样就不DRY了。

 

Python代码 
  1. from django import template  
  2.   
  3. template.add_to_builtins('app.templatetags.custom_tag_module')  
 

请将以上代码放到项目启动时能加载的模块中(settings.py, urls.py, models.py等)即可。

 

上面代码的作用是在项目启动时就把自定义模板标签或过滤器加载进来,模板中任何一个地方都可以使用它们,而不需要{% load template_tags %}。

 

7,合理配置和使用URL

 

不要将URL全都配置在一个urls.py文件中,比如:

 

Python代码 
  1. urlpatterns = patterns('',  
  2.   url(r'^askalumini/question/$','.....registerInstitution',name='iregister'),  
  3.   url(r'^askalumin/answer/$','someview.....',name='newmemberurl'),  
  4.   url(r'^institution/member/$','someview.....',name="dashboardurl"),  
  5.   url(r'^institution/faculty/$','editInstitute',name="editinstituteurl"),  
  6.   url(r'^memeber/editprofile/$','editProfile',name="editprofileurl"),  
  7.   url(r'^member/changepassword/$','changePassword',name="changepasswordurl"),  
  8.   url(r'^member/forgotpassword/$','forgotPassword',name="forgotpasswordurl"),  
  9.   url(r'^member/changepicture/$','changePicture',name="changepictureurl"),  
  10.   url(r'^member/logout/$','memeberlogout',name="logouturl"), ,  
  11. )  
 

建议的方式是将各应用的URL配置在各自的urls.py中,这样可以使应用更容易重复使用到不同项目里:

 

Python代码 
  1. urlpatterns = patterns('',  
  2.   (r'^$', include('institution.urls')),  
  3.   (r'^institution/', include('institution.urls')),  
  4.   (r'^askalumini/', include('askalumini.urls')),  
  5.   (r'^member/', include('member.urls')),  
  6. )  
 

如下是应用askalumini的urls.py:

 

Python代码 
  1. urlpatterns = patterns('askalumini.views',  
  2.   url(r'^$','askHome',name='askaluminiurl'),  
  3.   url(r'^questions/(?P<questionno>/d+)/$','displayQuestion',name='askquestiondisplay'),  
  4.   url(r'^askquestions/$','askQuestion',name='askquestionurl'),  
  5.   url(r'^postcomment/$','postComment',name="askquestioncomment")  
  6. )  
 

刚才提到静态文件路径不要硬编码,url的处理方式也尽量不要硬编码,否则当你更改一个地址时会牵涉到多处的修改,可以使用一些url函数来处理。

 

在/project/askalumini/urls.py中,为每一个url定义了name,它可以帮助我们有效地在视图、模板和模型中处理url,而不是硬编码。

 

为保证名称的唯一,请遵照将url命名为<appname>/<somelabel>的习惯用法。

 

举例来说,在views.py文件中有如下代码:

 

Python代码 
  1. HttpResponseRedirect("/askalumini/questions/54")  
 

请改为:

 

Python代码 
  1. from django.core.urlresolvers import reverse  
  2. HttpResponseRedirect(reverse('askquestiondisplay',kwargs={'questionno':q.id}))   

 

在模型中使用models.permalink装饰器来格式url:

 

Python代码 
  1. @models.permalink  
  2. def get_absolute_url(self):  
  3.     return ('profileurl2',(),{'userid': self.user.id})  
 

在模板中使用url标签代替硬编码:

 

Html代码 
  1. {% url askquestiondisplay 345 %}  
  2. <a href="{% url askquestiondisplay 345 %}"> Ask Question </a>   

 

8,调试

 

调试通常会借助一些第三方工具来获得更多的运行时信息。

 

一个请求执行了多少句SQL?花了多长时间?

 

调用的哪个模板?客户端设置了什么COOKIE?SESSION呢?。。。

 

你可以使用django-debug-toolbar查看上面甚至更多的信息:http://github.com/robhudson/django-debug-toolbar

 

另一个工具是Werkzeug debugger,它可以在错误页面打开python shell,让你更方便的跟踪错误信息,请访问:http://blog.dpeepul.com/2009/07/14/python-shell-right-on-the-django-error-page/ 获得更多信息。

 

还有pdb,一个强大的调试工具:http://ericholscher.com/blog/2008/aug/31/using-pdb-python-debugger-django-debugging-series-/

 

9,了解pinax备用

 

django最大的优点是代码重用,DRY,pinax就是这样一个平台,包含了许多可拿来直接使用的代码,比如openid,电子邮件验证等等。请访问:http://pinaxproject.com/

 

10,了解一些著名的第三方应用

 

1)数据库升级工具

 

什么是数据库升级工具?你运行了syncdb,运行了一年之后,对模型做了更改,添加了字段,删除了字段,要再运行syncdb吗?或者ALTER TABLE ...?

 

django-evolutions可以帮你完成上面的事情,但它好像不够强壮:http://code.google.com/p/django-evolution/

 

South能很强壮地完成上面的事情,但是需要学学怎么用:http://south.aeracode.org/

 

2)模板系统

 

django自带的模板系统是可以替换的,并且各自有优缺点。

 

template-utils增强了模板的比较标签等功能 ,并提供其他的一些实用特性:http://django-template-utils.googlecode.com/svn/trunk/docs/

 

Jinja是一个完整的第三方模板系统,可以替换默认模板系统,它提供了许多优越的特性:http://jinja.pocoo.org/2/

 

3)第三方应用

 

django command extensions提供了很多实用的命令行功能:

 

shell_plus加载所有django模型

 

runserver_plus整合了Werkzeug调试工具

 

生成模型图表,你可以展示给你的老板

 

……

 

请参考:http://ericholscher.com/blog/2008/sep/12/screencast-django-command-extensions/

 

Sorl可以生成缩略图:http://code.google.com/p/sorl-thumbnail/

 

…………

 

---END---

 

另外,从原文的评论里也有不少发现:

 

 

部署Django项目其他注意事项 我们平时调试代码的时候使用的是runserver,但是要正式发布的服务,我们需要一个可以稳定而持续的服务器,比如Apache, Nginx, IIS等,下文将以 Apache为例。 1.关闭Debug模式 debug模式开启,出现bug的时候有很多敏感信息会直接显示在网站上,只适合于开发人员调试,当程序部署的时候,最好设置为False。 在项目的setting文件下。 (1)设置404.html,... 阅读详情

相关推荐

在Django中同时使用多个配置文件的方法

主要介绍了在Django中同时使用多个配置文件的方法,Django是丰富多彩的Python web框架中人气最高的一个,需要的朋友可以参考下

Django新手需要注意的10个要点

接触django是从上个月开始,学习python时间也不长,但我经常在社区看看别人发表的文章,早上看到一篇不错的博客,却一直不能访问,最终从bing的缓存里找到,因为害怕丢失和忘掉,所以顺便翻译过来,放到这里,同时也分享给大家,贡献给各位django初学的朋友们,希望能有一些帮助:) 原文地址是:http://zeroandone.posterous.com/top-10-t...

小小猪的小开发 415

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测

本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。

weixin_29090089的博客 504

Django打造大型企业官网-知识点汇总(二)

Django打造大型企业官网-知识点汇总(二) 一、memcached缓存介绍 1、memcached简单介绍:  1.1、memcached官网:www.danga.com 或 memcached.org  1.2、Memcached 是一个高性能的分布式的内存对象缓存系统,全世界有不少公司采用这个缓存项目来构建大负载的网站,来分担数据库的压力。memcached 是通过在内存里维...

weixin_30318645的博客 267

小华半导体HC32芯片开发使用说明

HC32F/L系列MCU在Keil MDK和IAR Workbench环境下通过工程样例进行软件开发。

小布的芯视角 5626

MATLAB 论文复现——面向紧急需求响应的规模化灵活资源负荷管理快速决策方法

其次,对灵活资源参与EDR的功率分配模型进行了建模,并提出了基于分层分布式共识算法的快速决策方法,对功率分配模型进行快速求解,以满足EDR实时性的需求,在保证较高精度的前提下提高了决策速度。[1]孔祥玉,杨至端,孙裕策,等.面向紧急需求响应的规模化灵活资源负荷管理快速决策方法[J/OL].电力系统自动化,1-13[2024-07-29].http://kns.cnki.net/kcms/detail/32.1180.TP.20240709.1843.002.html.关键词: 规模化灵活资源;

sjr1478的博客 372

Django学习笔记四:urls配置详解

Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。URL配置是Django框架中非常重要的一部分,它定义了URL模式与视图函数之间的映射关系。

软件行业技术文化交流。 1518

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3196

django url的注意

1.通常我们可以项目下url.py中,使用include()关联到模块中的url,然后在子app中的url.py 进行修改。 2.我们也可以在项目下的url.py 直接编写 3.相同url开头的url的坑: from django.conf.urls import url from . import views urlpatterns=[ url(r"^i...

liming066的博客 833

SAP S4业务伙伴(BP)实战指南:从角色分配到数据同步的完整流程

本文详细解析了SAP S4业务伙伴(BP)功能,从基础概念到实战操作,涵盖角色分配、数据同步及常见问题排查。通过BP机制,企业可高效管理客户、供应商等多重身份,实现数据共享和动态切换,显著提升主数据管理效率。特别适合SAP实施顾问和ERP管理员参考。

y2z3a4b5c的博客 868

Android 14安装的APK默认允许运行时权限

本文介绍了在Android系统中实现安装应用后自动授予运行时权限的方法。通过在安装完成广播中检测应用安装状态,调用新增的DefaultPermissionGrantPolicy.grantAppRuntimePermissions()函数来授予常规权限,并使用allowSpecialPermission()处理特殊权限(如安装未知应用和悬浮窗权限)。文章详细说明了如何修改DefaultPermissionGrantPolicy类,添加grantAppRuntimePermissions和grantRunti

热衷于Android Framework和系统APP的修改经验分享 683

Django 框架简介与使用注意事项

点击上方 "程序员小乐"关注公众号,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文You will meet two kinds of people in life: ones who build you up and ones who tear you down. But in the end, you'll thank them both.生命中你会遇到两种人:一种是鼓励...

吧主 286

GPFS扩展技术原理(十一)-FMDN广播与EID加解密

GFPS扩展技术原理(十一)FMDN广播及EID加解密

十多年蓝牙协议软件开发,擅长蓝牙协议分析 934

Django初识:HTTP协议、web框架、运行django项目的注意事项、创建项目、目录结构、三板斧

文章目录一、 Web框架本质二、 HTTP协议1. HTTP协议的四大特性2. HTTP协议的数据传输格式3. 响应状态码4. 请求方法:5. 请求数据格式示例:三、 纯手写web框架(了解即可)1. 处女版自定义web框架2. wsgiref模块3. 封装处理4. 动静态网页5. 总结1.纯手撸web框架2.基于wsgiref模块3.根据功能的不同拆分成不同的文件夹4.jinja2模板语法5.简易版本web框架流程图四、 Python三大主流web框架五、⚠ 想要正常运行django项目所需要知道的注意事

大大的博客 425

RH850从0搭建Autosar开发环境【6】- Davinci Configurator之CanIf模块配置详解(下)

RH850从0搭建Autosar开发环境【6】- Davinci Configurator之CanIf模块配置详解(下)

weixin_42412049的博客 2584

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Django 框架 要点

Python Web 框架要点

qq_42740465的博客 4863

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Django使用的注意事项

1.如何搭建虚拟环境? 安装虚拟环境的命令 : sudo pip install virtualenv sudo pip install virtualenvwrapper 2.安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量: 2.1 创建目录用来存放虚拟环境 mkdir $HOME/.virtualenvs 2.2 打开~/.bashrc文件,...

qq_39581763的博客 230

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Django框架知识要点总结笔记

哪些请求方式在请求地址的时候可以带请求体? 只有PATCH、POST、PUT、DELETE访问一个url地址时可以带请求体 web框架和web服务器 web框架:flask Django 作用: 1.路由分发(根据url找到对应的处理函数) 2.调用处理函数进行业务处理。 web服务器 app.run() 作用: 1.解析请求报文,调用框架程序处理请求。 2.组织响应报文,返回内容给客户端。 w...

monkey的博客 1760

在 Django 中使用 logging

在 Django 中使用 logginglogging 模块简介logging 是 python 标准库中的模块,用于记录 log。主要包括以下四个组件: Loggers 向应用程序提供log接口 Handlers 将log记录发送到指定的目的地(控制台输出,或写入文件或发向网络等等) Filters 提供一个分级策略控制 log 输出等级 Formatters 指定输出的最终格式。 下面是 Pyt

木头骑士的旋转木马 4745

Django2项目开发注意事项

表单POST请求需要加{% csrf_token %} reverse反转写法 #users为当前app的名称,index为路径名称 reverse('users:index')

起风了 213

Django技术要点实例

1, 安装Django     pip install django 2, 创建项目     django-admin start project 项目名     *注意事项:win系统不要包含中文路径名或机器名 3, 创建app     进入项目目录, 运行目录下的 manage.py     python manage.py startapp app名 4, 启动开发服务器     py...

qq_42794321的博客 424

python中datetime的比较方法使用

python中的datetime module是专门处理时间相关内容的模块,功能很强大,但是反而显得比较复杂。一下代码是用来求从mysql中取到的timestamp和当前时间比较,求时间差的方法import datetimelasttime=a.get_last_timestamp(sid=40)[-1]["last_time"] #取到timestampdelta = dat

yiihsia的学习阵地 1万+
上一篇: 在django中使用logging模块
下一篇: Python正则表达式的常用匹配用法
Java2King
博客等级 码龄18年 221粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值