Django 是从真实世界的应用中成长起来的,它是由 堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组编写的。 它诞生于 2003 年秋天,那时 Lawrence Journal-World 报纸的 程序员 Adrian Holovaty 和 Simon Willison 开始用 Python 来编写程序。
当时他们的 World Online 小组制作并维护当地的几个新闻站点, 并在以新闻界特有的快节奏开发环境中逐渐发展。 这些站点包括有 LJWorld.com、Lawrence.com 和 KUsports.com, 记者(或管理层) 要求增加的特征或整个程序都能在计划时间内快速的被建立,这些时间通常只有几天 或几个小时。 因此,Adrian 和 Simon 开发了一种节省时间的网络程序开发框架, 这是在截止时间前能完成程序的唯一途径。
2005 年的夏天,当这个框架开发完成时,它已经用来制作了很多个 World Online 的站点。 当时 World Online 小组中的 Jacob Kaplan-Moss 决定把这个框架发布为一个开源软件。
从今往后数年,Django是一个有着数以万计的用户和贡献者,在世界广泛传播的完善开源项目。 原来的World Online的两个开发者(Adrian and Jacob)仍然掌握着Django,但是其发展方向受社区团队的影响更大。
这些历史都是相关联的,因为她们帮助解释了很重要的两点。
第一,Django最可爱的地方。Django 诞生于新闻网站的环境中,因此它提供很多了特性(如管理后台),非常适合内容类的网站,如Amazon.com, craigslist.org和washingtonpost.com,这些网站提供动态的,数据库驱动的信息。 (不要看到这就感到沮丧,尽管Django擅长于动态内容管理系统, 但并不表示Django主要的目的就是用来创建动态内容的网站。 某些方面特别高效与其他方面不高效是有区别的,Django在其他方面也同样高效。)
第二,Django的起源造就了它的开源社区的文化。 因为Django来自于真实世界中的代码,而不是 来自于一个科研项目或者商业产品,她主要集中力量来解决Web开发中遇到的问题,同样 也是Django的开发者经常遇到的问题。 这样,Django每天在现有的基础上进步。 框架的开发者对于让开发人员节省时间,编写更加容易维护的程序,同时保证程序运行的效率具有极大的兴趣。 无他,开发者动力来源于自己的目标:节省时间,快乐工作。 (坦率地讲,他们使用了自己公司的产品。)
安装:
自动化安装
#更新依赖库
pip install --upgrade setuptools
#安装指定的版本
pip install Django==2.0.4
文件式安装
进入到Django文件安装目录,输入命令:
python setup.py install
安装后打印版本号
python -m django –version
生成Django项目
django-admin startproject mysite
注意:有的django-admin找不到问题,需要配置环境变量
启动服务
python manage.py runserver
本地化中间件
'django.mididdleware.locale.LocaleMiddleware',
路由包括 精准路由和正则路由
#定义首页 首页留空 第二个参数 指定路由方法
path('',d1.index),
#再定义一个路由
path('test',d1.test),
#定义一个重定向页面
path('123',d1.re_url),
#使用多个网址来指向同一个路由方法
path('456',d1.re_url),
#定义存储cookie的路由
path('save_cookie',d1.save_cookie),
#定义获取cookie的路由
path('get_cookie',d1.get_cookie),
#定义删除cookie的路由
path('del_cookie',d1.del_cookie),
#定义一个正则路由,可以使用d数字
#常用元字符 .匹配所有 d数字 D非数字 w 字母数字_
#如果在正则路由内,使用()分组,那么django会认为进行路由传参
# re_path('^test-d+-.*$',d1.test_re)
re_path('^test-(d+)-(.*)$',d1.test_re)
Cookie 操作
#定义设置cookie(存储)
def save_cookie(request):
#定义回应
response = HttpResponse("存储cookie ok")
#定义过期时间
expires = datetime(year=2019,month=11,day=20,hour=15,minute=5,second=0)
#转储为django内置时间
expires = make_aware(expires)
#进行存储动作
response.set_cookie("username","jack",expires=expires)
#将回应对象返回
return response
#定义获取cookie(取)
def get_cookie(request):
#定义变量获取cookies属性
cookies = request.COOKIES
#从cookies通过key获取value
username = cookies.get("username","未拿到用户名")
#将用户名返回
return HttpResponse(username)
#定义删除cookie方法
def del_cookie(request):
#定义response对象
response = HttpResponse("删除cookie成功")
#调用delete_cookie()方法来删除cookie
response.delete_cookie("username")
#返回response
return response
Django 模板 采用了 jinja2模板 但是与flask有一定的出入需要注意
#导入模板解析库
from django.shortcuts import render
#模板传值
return render(request,'d2_index.html',{'test_str':test_str,'test_int':test_int,'test_list':test_list,'test_dict':test_dict,'content':content,'dt':dt})
{# 模板语法输出 #}
{{ test_str }}
{# 加法运算 通过调用内置过滤器来实现加法运算 #}
{{ test_int | add:-10 }}
{# 模板输出list #}
{{ test_list }}
{{ test_list.2 }}
{% for item in test_list %}
{{ item }}
{# 打印索引 counter 从1开始的计数器 #}
{{ forloop.counter }}
{# 打印数组索引 #}
{{ forloop.counter0 }}
{# 倒序索引 #}
{{ forloop.revcounter }}
{% endfor %}
{# 循环嵌套输出 #}
{% for item in test_dict %}
{# 取首位和末尾 #}
姓名:{{ item.name | first }} {{ item.name | last }} 年龄:{{ item.age }}
{% endfor %}
{# 大小写互转 #}
{{ 'jack' | upper }}
{{ 'ROSE' | lower }}
{# 链式调用 #}
{{ 'jack' | first | upper }}
{# 返回长度 #}
{{ '123456' | length }}
{# 截断操作 #}
截断字符操作{{ content | truncatechars:20 }}
截断单词操作{{ content | truncatewords:3 }}
{# 格式化日期 #}
{{ dt | date:"Y-m-d H:i:s" }}
Cookie简易操作
#定义回应
response = HttpResponse("存储成功")
#第三个参数也可以传max_age,单位是秒
response.set_cookie("email",p1,max_age=10)
#返回回应
return response