320 likes | 599 Views
Django. yanxu@staff.sina.com.cn. 网络开发人员的开发流程. 从头开始编写网络应用程序。 从头编写另一个网络应用程序。 从第一步中总结(找出其中通用的代码),并运用在第二步中。 重构代码使得能在第 2 个程序中使用第 1 个程序中的通用代码。 重复 2-4 步骤若干次。 意识到你发明了一个框架。. Django History. 2003开始 LJWorld.com Lawrence.com KUsports.com Adrian Holovaty & Simon Willison 2005.7
E N D
Django • yanxu@staff.sina.com.cn
网络开发人员的开发流程 • 从头开始编写网络应用程序。 • 从头编写另一个网络应用程序。 • 从第一步中总结(找出其中通用的代码),并运用在第二步中。 • 重构代码使得能在第 2 个程序中使用第 1 个程序中的通用代码。 • 重复 2-4 步骤若干次。 • 意识到你发明了一个框架。
Django History • 2003开始 • LJWorld.com Lawrence.com KUsports.com • Adrian Holovaty & Simon Willison • 2005.7 • 爵士乐吉他演奏家 Django Reinhardt
Django • Django最可爱的地方,因为Django诞生于一个新闻环境,她提供了很多的功能,特别是她的管理接口, 特别适合提供内容的网站
Django • 不要看到这就感到沮丧,尽管Django擅长于动态内容管理系统, 但并不表示Django主要的目的就是用来创建动态内容的网站。 某些方面 特别高效 与 其他方面 不高效 是有区别的
Django的哲学 • 模板要保持简单 • 不能替代SQL的ORM • 鼓励测试
Quick Start • 演示
Django是把瑞士军刀 • Filter & Tag • ORM[常见关系模型 and 数据库] • Cache • Auth • Upload file • Form • .......
Filter • <td>{{ user.birthday|toage }}</td> • <td>{{ user.username|capfirst }}</td>
toage @register.filter def toage(birthday): ‘’’ >>> toage( datetime(1982,3,23) ) 27 ‘’’ return (datetime.now()-birthday).days()/365
Simple Tag • {%if name%} {{name}} {%endif%} • {% current_time "%Y-%m-%d %I:%M %p" %}
current_time @register.simple_tag def current_time(format_string): return datetime.now().strftime(format_string)
ORM 文章 评论 图片
Cache • CACHE_BACKEND = 'memcached://127.0.0.1:11211/' • >>> cache.set('my_key', 'hello, world!', 30) • >>> cache.get('my_key')
Auth • 切换不同的认证系统 • 用户,组,权限的管理 • 在模板中使用认证 • 在代码中使用认证
切换认证 AUTHENTICATION_BACKENDS=( 'sinard.ldapauth.LDAPBackend', #'django.contrib.auth.backends.ModelBackend', )
Auth {% if user.is_authenticated %} <p>Welcome, {{ user.username }}. Thanks for logging in.</p>{% else %} <p>Welcome, new user. Please log in.</p>{% endif %}
Permissions {% if perms.foo %} <p>You have permission to do something in the foo app.</p> {% if perms.foo.can_vote %} <p>You can vote!</p> {% endif %} {% if perms.foo.can_drive %} <p>You can drive!</p> {% endif %}{% else %} <p>You don't have permission to do anything in the foo app.</p>{% endif %}
in Views def my_view(request): if not (request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): return HttpResponse("You can't vote in this poll.") # ...
@login_required from django.contrib.auth.decorators import login_required@login_requireddef my_view(request): # ...
Form >>> class CommentForm(forms.Form):... name = forms.CharField(initial='class')... url = forms.URLField()... comment = forms.CharField()>>> f = CommentForm(initial={'name': 'instance'}, auto_id=False)>>> print f<tr><th>Name:</th><td><input type="text" name="name" value="instance" /></td></tr><tr><th>Url:</th><td><input type="text" name="url" /></td></tr><tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
cleaned_data >>> data = {'subject': '',... 'message': 'Hi there',... 'sender': 'invalid e-mail address',... 'cc_myself': True}>>> f = ContactForm(data)>>> f.is_valid()False>>> f.cleaned_data...AttributeError: 'ContactForm' object has no attribute 'cleaned_data'
cleaned_data >>> data = {'subject': 'hello',... 'message': 'Hi there',... 'sender': 'foo@example.com',... 'cc_myself': True,... 'extra_field_1': 'foo',... 'extra_field_2': 'bar',... 'extra_field_3': 'baz'}>>> f = ContactForm(data)>>> f.is_valid()True>>> f.cleaned_data # Doesn't contain extra_field_1, etc.{'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'}
Why Django? • django • tg • pylons • uliweb • ror • ........
我选择Django的原因 • 质朴 • 方便开发 • Web是一个由简单到复杂的过程 • 用一个框架可以减少重复建设时间
Django Admin http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin
admin.py from django.contrib import adminfrom myproject.myapp.models import Authoradmin.site.register(Author)
常见问题 • ORM不支持的SQL怎么办 • Django如何连接mysql • 听说django模板引擎效率很低 • 我应该基于Django Admin做开发吗
缺点 • 不够友好的URL规则 • 不支持多数据库操作 • 文档 0.96 1.0 1.1 Dev..... • 中文资料
django Dev • 加入到Django的开发中来 • http://code.djangoproject.com/newticket • svn diff • .diff file • 最好带上测试代码 • Code Style: http://is.gd/4DIAE