假如你在 web 开发领域工作了足够长的时间,你最终会得出如许的结论:你可以用任何 web 框架和编程语言产生相同的结果。但是,虽然您实际上可以产生相同的结果,但是差别很大的是您创建解决方案所耗费的时间:创建原型的时间、添加新功能的时间、进行测试的时间、进行调试的时间、摆设到规模的时间等等。
从这个意义上来说,Django 框架利用了一套设计原则,与许多其他 web 框架相比,它产生了最有生产力的 web 开发过程之一。注意,我并不是说 Django 是银弹(例如,最好的原型,最具伸缩性);我是说,最终,Django 框架包含了一组设计原则和权衡,使其成为构建大多数大中型 web 应用所需特性的最有用的框架之一。
如今,虽然你可能以为我有偏见——毕竟我正在写一本关于这个主题的书——我将首先列出这些设计原则,如许你可以更好地理解是什么赋予了 Django 框架这种上风。
不重复自己(干)的原则
图 1-3。
Default home page for a Django project
有时更改 Django 开发 web 服务器的默认地点和端口很方便。这可能是因为默认端口正被另一个服务占用,或者需要将 web 服务器绑定到非当地地点,以便远程计算机上的某个人可以查看开发服务器。这很容易通过将端口或完整地点:端口字符串附加到python manage.py runserver命令来实现,如列表 1-13 中的各种示例所示。
# Run the development server on the local address and port 4345 (http://127.0.0.1:4345/)
python manage.py runserver 4345
# Run the dev server on the 96.126.104.88 address and port 80 (http://96.126.104.88/)
python manage.py runserver 96.126.104.88:80
# Run the dev server on the 192.168.0.2 address and port 8888 (http://192.168.0.2:8888/)
python manage.py runserver 192.168.0.2:8888
Listing 1-13.Start Django development web server on different address and port
from django.shortcuts import renderdef detail(request,store_id='1',location=None):
# Access store_id param with 'store_id' variable and location param with 'location' variable # Extract 'hours' or 'map' value appended to url as # ?hours=sunday&map=flash hours = request.GET.get('hours', '') map = request.GET.get('map', '') # 'hours' has value 'sunday' or '' if hours not in url # 'map' has value 'flash' or '' if map not in url return render(request,'stores/detail.html')Listing 2-9.Django view method extracting url parameters with request.GET
复制代码
清单 2-9 利用了语法request.GET.get(<parameter>, '')。假如参数出如今request.GET中,它提取值并将其赋给一个变量以备将来利用;假如参数不存在,那么参数变量被赋予一个默认的空值''——你同样可以利用None或任何其他默认值——因为这是 Python 的标准字典get()方法语法的一部分,以获得默认值。
最后一个过程被设计成从 HTTP GET 请求中提取参数;然而,Django 还支持从 HTTP POST 请求中提取参数的语法request.POST.get,这将在 Django 表单一章和本章后面的 Django 视图方法请求一节中详细描述。
Url 整合和模块化
from django.shortcuts import renderdef detail(request,store_id='1',location=None):
# Create fixed data structures to pass to template # data could equally come from database queries # web services or social APIs STORE_NAME = 'Downtown' store_address = {'street':'Main #385','city':'San Diego','state':'CA'} store_amenities = ['WiFi','A/C'] store_menu = ((0,''),(1,'Drinks'),(2,'Food')) values_for_template = {'store_name':STORE_NAME, 'store_address':store_address, 'store_amenities':store_amenities, 'store_menu':store_menu} return render(request,'stores/detail.html', values_for_template)Listing 2-21.Set up dictionary in Django view method for access in template