Django基础教程
Django特点
强大的数据库功能
用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句
自带的强大的后台功能
几行代码就让你的网站拥有一个强大的后台,轻松管理你的内容!
优雅的网址
用正则匹配网址,传递到对应函数,随意定义,如你所想!
模板系统
强大,易扩展的模板系统,设计简易,代码,样式分开设计,更容易管理。
缓存系统
与memcached或其它的缓存系统联用,更出色的表现,更快的加载速度。
国际化
完全支持多语言应用,允许你定义翻译的字符,轻松翻译成不同国家的语言。
Django常用模块
- urls.py:网址入口,关联到对应的views.py中的一个函数,访问网址就对应一个函数。
- views.py:处理用户发出的请求,从urls.py中对应过来,通过渲染templates中的网页可以来显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。
- models.py:与数据库操作相关,存入或读取的数据时用到这个,当然用不到数据库的时候,你可以不使用。
- forms.py:表单,用户在浏览器上输入数据提交,对数据的验证工作及输入框的生成等工作,当然你可以不使用。
- templates文件夹:views.py中的函数渲染templates中的html模板,得到动态内容的网页,当然可以用缓存来提高速度。
- admin.py:后台,可以用很少量的代码就拥有一个强大的后台。
- settings.py:Django的设置,配置文件,比如DEBUG的开关,静态文件的位置等。
环境搭建
下载源码
从https://www.djangoproject.com/download/中下载django的源码,如Django-1.11.tar.gz
安装
解压下载的文件,打开命令行(WIN+R键,打开运行,输入cmd,enter键),进入D:/Django-1.11/目录,执行`python setup.py install`命令(注意:要执行这个命令,必须要先把python安装,并且配置python路径的环境变量,这里我们讲的是django,就不再过多叙述了),然后就会自动安装了。
检查是否安装成功
在命令行上输入python,点击enter,进入python环境
>>> import django
>>> django.VERSION
(1, 11, 0, u'final', 1)
>>> django.get_version()
'1.11'
第一个django项目
新建一个django project
创建了一个名为myblog的项目
django-admin.py startproject mysite
运行后,我们会看到如下的目录样式:
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
新建app
一般一个项目有多个app,当然通用的app也可以在多个项目中使用。
创建一个名为learn的app,注意:先要进入项目目录中(第一个mysite),cd mysite
,然后执行下面语句,创建app。
python manage.py startapp learn
我们可以看到mysite中多了一个learn文件夹:
mysite
└── learn
| ├── migrations
| | └── __init__.py
| ├── __init__.py
| ├── admin.py
| ├── app.py
| ├── models.py
| ├── tests.py
| └── views.py
├── manage.py
└── mysite
把新定义的app加到settings.py中的INSTALL——APPS中,修改mysite/mysite/settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'learn',
)
目的:新建的app如果不加到INSTALL——APPS中的话,django就不能自动找到app中的模板文件(learn/templates/下的文件)和静态文件(learn/static/中的文件)。
定义视图函数(访问页面的内容)
打开learn/views.py,编写代码:
#coding:utf-8
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World!') #用来向浏览器返回内容
定义URL
打开mysite/mysite/urls.py,进行修改:
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', learn_views.index),
]
在命令行上运行python manage.py runserver
,这样就打开了服务器,然后我们就可以通过浏览器访问了。
打开浏览器,输入http://127.0.0.1:8000/,就可以看到Hello World!
注意:如果是要在另一台电脑上访问,要用python manage.py ip:port的形式,比如监听所有ip:
python manage.py runserver 0.0.0.0:8000
#监听机器所有ip,8000端口,访问时用电脑的ip代替127.0.0.1
视图与网址进阶
GET方法获取参数
采用/add/?a=4&b=5这样的方式进行
1、修改learn/views.py文件
from django.shortcuts import render
from django.http import HttpResponse
def add(request):
a=request.GET['a']
b=request.GET['b']
c=int(a)+int(b)
return HttpResponse(str(c))
注:request.GET 类似于一个字典,更好的办法是用 request.GET.get(‘a’, 0) 当没有传递 a 的时候默认 a 为 0
2、修改mysite/urls.py文件
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^add/$', learn_views.add,name='add'),
]
打开网址:http://127.0.0.1:8000/add/?a=4&b=5,就可以看到网页上显示了一个9。
采用/add/3/4/这样的方式进行
1、修改learn/views.py文件,新定义一个add2函数
def add2(request,a,b):
c=int(a)+int(b)
return HttpResponse(str(c))
2、修改mysite/urls.py文件,加上:
url(r'^add/(\d+)/(\d+)/$', learn_views.add2, name='add2'),
正则表达式中:
\d 代表一个数字,
+ 代表一个或多个前面的字符,
写在一起 \d+ 就是一个或多个数字,用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被 views.py 中的对应视图函数接收。
我们再访问:http://127.0.0.1:8000/add/4/5/,就可以看到和刚才一样的效果,但是现在网址更优雅了。
URL name详解
url(…,name=’add’)中name的作用:name可以用于在templates、models、views中得到对应的网址,相当于给网址取了一个名字,只要这个名字不变,地址变了也能通过名字获取到。
修改learn/views.py文件:
from django.shortcuts import render
def index(request):
return render(request,'home.html')
在learn中新建一个templates文件夹,在该文件夹中新建一个home.html文件,向其中写入:
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
</head>
<body>
<a href="/add/4/5/">计算 4+5</a>
</body>
</html>
修改mysite/urls.py文件,加入:
url(r'^$', learn_views.index, name='home'),
运行服务器,访问:http://127.0.0.1:8000/就可以看到一个页面,页面上有一个链接计算 4+5
问题:这样会写死网址,会在改了网址(正则)后,很多地方都要修改。
解决:
reverse接收url中的name作为第一个参数,代码中可以通过reverse()获取对应的网址,只要url的name不改,就不用改代码中的网址
from django.urls import reverse
>>>reverse('add2',args=(4,5))
u'/add/4/5'