具体介绍Django以前,必须先介绍WEB框架等概念。css
Web框架:通俗地讲,就是别人已经设定好的一个web网站模板,你学习它的规则,而后「填空」或「修改」成你本身须要的样子。html
通常Web框架的架构是这样的:
前端
其它基于python的web框架,如tornado、flask、webpy都是在这个范围内进行增删裁剪的。例如tornado用的是本身的异步非阻塞“wsgi”,flask则只提供了最精简和基本的框架。Django则是直接使用了WSGI,并实现了大部分功能。python
MVC:全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑汇集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑。mysql
通俗解释:一种文件的组织和管理形式!不要被缩写吓到了,这其实就是把不一样类型的文件放到不一样的目录下的一种方法,而后取了个高大上的名字。固然,它带来的好处有不少,好比先后端分离,松耦合等等,就不详细说明了。jquery
MTV: 有些WEB框架以为MVC的字面意思很别扭,就给它改了一下。view再也不是HTML相关,而是主业务逻辑了,至关于控制器。html被放在Templates中,称做模板,因而MVC就变成了MTV。这其实就是一个文字游戏,和MVC本质上是同样的,换了个名字和叫法而已,换汤不换药。nginx
目录分开,就必须有机制将他们在内里进行耦合。在Django中,urls、orm、static、settings等起着重要的做用。一个典型的业务流程是以下图所示:web
其余经常使用命令:sql
- mysite # 对整个程序进行配置 - settings # 配置文件 - url # URL对应关系 - wsgi # 遵循WSIG规范,uwsgi + nginx - manage.py # 管理Django程序
settings.py数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } } # 因为Django内部链接MySQL时使用的是MySQLdb模块,而python3中还无此模块,因此须要使用pymysql来代替 # 以下设置放置的与project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb()
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
路由都在urls.py
文件里,它将浏览器输入的url映射到相应的业务处理逻辑。
url(r'^index$', views.index),
url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),
url(r'^home', views.home, name='h1'), url(r'^index/(\d*)', views.index, name='h2'),
设置名称以后,能够在不一样的地方调用,如:
url(r'^web/',include('web.urls')),
django中的路由系统和其余语言的框架有所不一样,在django中每个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其余大部分的Web框架则是对一类的url请求作一条路由映射,从而是路由系统变得简洁。
经过反射机制,为django开发一套动态的路由系统Demo:点击下载
在每一个django项目中能够包含多个APP,至关于一个大型项目中的分系统、子模块、功能部件等等,相互之间比较独立,但也有联系。
全部的APP共享项目资源。
在pycharm下方的terminal终端中输入命令:
python manage.py startapp cmdb
这样就建立了一个叫作cmdb的APP,django自动生成“cmdb”文件夹。
业务处理逻辑都在views.py
文件里。
经过上面两个步骤,咱们将index这个url指向了views里的index()函数,它接收用户请求,并返回一个“hello world”字符串。
如今咱们已经能够将web服务运行起来了。
命令行的方式是:python manage.py runserver 127.0.0.1:8000
在pycharm中能够直接点击运行图标就能够运行起来,注意运行图标旁要选择整个 django 项目。
至此,一个最简单的django编写的web服务就启动成功了,打开浏览器试一下吧。
一般咱们都是将html文件返回给用户,你可使用 open 直接打开html文件让浏览器去解释,可是 django 提供了一种更好的方式避免你每次都去打开html文件,那就是render
示例:
def index(request): return render(request, "index.html",)
如同上面 4.3.3 所说的,render 会自动去 template 目录里去找html文件,若是你的html有多级目录,你也能够直接这样去写:
def index(request): return render(request, "cmdb/index.html",)
咱们已经能够将html文件返还给用户了,可是还不够,前端三大块,html、css、js还有各类插件,它们齐全才是一个完整的页面。在django中,通常将静态文件放在static目录中。接下来,在mysite中新建个static目录。
在index.html文件中,能够引入css文件:
<link rel="stylesheet" href="/static/commons.css" />
也能够引入 JS 文件:
<script src="/static/js/jquery-1.12.4.js"></script>
为了让django找到这个目录,依然须要对settings进行配置:
STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), )
上面,咱们将一个要素齐全的html文件返还给了用户浏览器。但这还不够,由于web服务器和用户之间没有动态交互。下面咱们设计一个表单,让用户输入用户名和密码,提交给index这个url,服务器将接收到这些数据。
先建立login.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/commons.css" /> <style> label{ width: 80px; text-align: right; display: inline-block; } </style> </head> <body> <form action="/login/" method="POST" /> <p> <label for="username">用户名:</label> <input id="username" name="user" type="text" /> </p> <p> <label for="password">密码:</label> <input id="password" name="pwd" type="text" /> <input type="submit" value="提交" /> <span style="color: red">{{ error_msg }}</span> </p> </form> </body> </html>
而后修改views.py文件:
def login(request): if request.method == "POST": user = request.POST.get('user',None) password = request.POST.get('pwd',None) error_msg="" if user == 'root' and password == '123': return redirect('http://www.baidu.com') else: error_msg="用户名或密码错误" return render(request,'login.html',{'error_msg':error_msg})
此时 ,重启web服务时,会出错,由于django有一个跨站请求保护机制,咱们在settings文件中将它关闭。
# 'django.middleware.csrf.CsrfViewMiddleware',
再次进入浏览器,刷新页面,输入正确的密码和错误的密码看看效果吧。
咱们收到了用户的数据,但返回给用户的依然是个静态页面,一般咱们会根据用户的数据,进行处理后在返回给用户。这时候,django采用本身的模板语言,相似jinja2,根据提供的数据,替换掉html中的相应部分,详细语法入门后再深刻学习。
先改造views.py文件:
再改造index.html文件:
重启服务,刷新浏览器:能够看到,咱们得到了用户实时输入的数据,并将它实时展现在了用户页面上,这是个不错的交互过程。
流程走到这里,django的MTV框架基本已经浮出水面了,只剩下最后的数据库部分了。
上面咱们虽然和用户交互得很好,但并无保存任何数据,页面一旦关闭,或服务器重启,一切都将回到原始状态。
使用数据库是毫无疑问的,django经过自带的ORM框架操做数据库,而且自带轻量级的sqlite3数据库。下面咱们来看一看:
首先是注册app:
不注册它,你的数据库就不知道该给哪一个app建立表。
而后咱们在settings中,配置数据库相关的参数,若是使用自带的sqlite,不须要修改。
再编辑models.py文件,也就是MTV中的M。
这里咱们建立了2个字段,分别保存用户的名字和密码。接下来要在pycharm的teminal中经过命令建立数据库的表了。有2条命令,分别是:
python manage.py makemigrations
再输入命令:python manage.py migrate
修改views.py中的业务逻辑
重启web服务后,刷新浏览器页面,以后和用户交互的数据都能保存到数据库中。任什么时候候均可以从数据库中读取数据,展现到页面上。
至此,一个要素齐全,主体框架展现清晰的django项目完成了!