Python-18-Django 基础篇

1. Web 框架介绍

具体介绍Django以前,必须先介绍WEB框架等概念。css

Web框架:通俗地讲,就是别人已经设定好的一个web网站模板,你学习它的规则,而后「填空」或「修改」成你本身须要的样子。html

通常Web框架的架构是这样的:
image前端

其它基于python的web框架,如tornado、flask、webpy都是在这个范围内进行增删裁剪的。例如tornado用的是本身的异步非阻塞“wsgi”,flask则只提供了最精简和基本的框架。Django则是直接使用了WSGI,并实现了大部分功能。python

2. MVC/MTV 介绍

MVC:全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑汇集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑。mysql

通俗解释:一种文件的组织和管理形式!不要被缩写吓到了,这其实就是把不一样类型的文件放到不一样的目录下的一种方法,而后取了个高大上的名字。固然,它带来的好处有不少,好比先后端分离,松耦合等等,就不详细说明了。jquery

  • 模型(model):定义数据库相关的内容,通常放在models.py文件中。
  • 视图(view):定义HTML等静态网页文件相关,也就是那些html、css、js等前端的东西。
  • 控制器(controller):定义业务逻辑相关,就是你的主要代码。 

MTV: 有些WEB框架以为MVC的字面意思很别扭,就给它改了一下。view再也不是HTML相关,而是主业务逻辑了,至关于控制器。html被放在Templates中,称做模板,因而MVC就变成了MTV。这其实就是一个文字游戏,和MVC本质上是同样的,换了个名字和叫法而已,换汤不换药。nginx

3. Django 的 MTV 模型组织

目录分开,就必须有机制将他们在内里进行耦合。在Django中,urls、orm、static、settings等起着重要的做用。一个典型的业务流程是以下图所示:web

image

4. Django 基本配置

4.1 建立 django 程序

  • 终端命令:django-admin startproject sitename
  • IDE建立Django程序时,本质上都是自动执行上述命令

其余经常使用命令:sql

  • python manage.py runserver 0.0.0.0:8001
  • python manage.py startapp appname
  • python manage.py syncdb
  • python manage.py makemigrations
  • python manage.py migrat
  • python manage.py createsuperuser

4.2 程序目录

image

- mysite        # 对整个程序进行配置
- settings      # 配置文件
- url           # URL对应关系
- wsgi          # 遵循WSIG规范,uwsgi + nginx
- manage.py     # 管理Django程序

4.3 配置文件说明

settings.py数据库

4.3.1 数据库

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() 

4.3.2 模板

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',
                ],
            },
        },
    ]

4.3.3 静态文件

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

4.4 路由系统

路由都在urls.py文件里,它将浏览器输入的url映射到相应的业务处理逻辑。

4.4.1 单一路由对应

url(r'^index$', views.index),

4.4.2 基于正则的路由

url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

4.4.3 添加额外的参数

url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

4.4.4 为路由映射设置名称

url(r'^home', views.home, name='h1'),
url(r'^index/(\d*)', views.index, name='h2'),

设置名称以后,能够在不一样的地方调用,如:

  • 模板中使用生成URL: {% url 'h2' 2012 %}
  • 函数中使用生成URL: reverse('h2', args=(2012,)) 路径:django.urls.reverse
  • Model中使用获取URL: 自定义get_absolute_url() 方法

4.4.5 根据app对路由规则进行分类

url(r'^web/',include('web.urls')),

django中的路由系统和其余语言的框架有所不一样,在django中每个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其余大部分的Web框架则是对一类的url请求作一条路由映射,从而是路由系统变得简洁。

经过反射机制,为django开发一套动态的路由系统Demo:点击下载

建立一条最简单的路由

image

4.5 建立 APP

在每一个django项目中能够包含多个APP,至关于一个大型项目中的分系统、子模块、功能部件等等,相互之间比较独立,但也有联系。

全部的APP共享项目资源。

在pycharm下方的terminal终端中输入命令:

python manage.py startapp cmdb

这样就建立了一个叫作cmdb的APP,django自动生成“cmdb”文件夹。

4.6 编写业务逻辑

业务处理逻辑都在views.py文件里。

image

经过上面两个步骤,咱们将index这个url指向了views里的index()函数,它接收用户请求,并返回一个“hello world”字符串。

4.7 运行 Web 服务

如今咱们已经能够将web服务运行起来了。

命令行的方式是:python manage.py runserver 127.0.0.1:8000

在pycharm中能够直接点击运行图标就能够运行起来,注意运行图标旁要选择整个 django 项目。

至此,一个最简单的django编写的web服务就启动成功了,打开浏览器试一下吧。

4.7 返回 HTML 文件

一般咱们都是将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",)

4.8 使用静态文件

咱们已经能够将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"),
)

4.9 接收用户发送的数据

上面,咱们将一个要素齐全的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',

再次进入浏览器,刷新页面,输入正确的密码和错误的密码看看效果吧。

4.10 返回动态页面

咱们收到了用户的数据,但返回给用户的依然是个静态页面,一般咱们会根据用户的数据,进行处理后在返回给用户。这时候,django采用本身的模板语言,相似jinja2,根据提供的数据,替换掉html中的相应部分,详细语法入门后再深刻学习。

先改造views.py文件:

image

再改造index.html文件:

image

重启服务,刷新浏览器:能够看到,咱们得到了用户实时输入的数据,并将它实时展现在了用户页面上,这是个不错的交互过程。

4.11 使用数据库

流程走到这里,django的MTV框架基本已经浮出水面了,只剩下最后的数据库部分了。

上面咱们虽然和用户交互得很好,但并无保存任何数据,页面一旦关闭,或服务器重启,一切都将回到原始状态。

使用数据库是毫无疑问的,django经过自带的ORM框架操做数据库,而且自带轻量级的sqlite3数据库。下面咱们来看一看:

首先是注册app:

image

不注册它,你的数据库就不知道该给哪一个app建立表。

而后咱们在settings中,配置数据库相关的参数,若是使用自带的sqlite,不须要修改。

image

再编辑models.py文件,也就是MTV中的M。

image

这里咱们建立了2个字段,分别保存用户的名字和密码。接下来要在pycharm的teminal中经过命令建立数据库的表了。有2条命令,分别是:
python manage.py makemigrations

image

再输入命令:python manage.py migrate

image

修改views.py中的业务逻辑

image

重启web服务后,刷新浏览器页面,以后和用户交互的数据都能保存到数据库中。任什么时候候均可以从数据库中读取数据,展现到页面上。

至此,一个要素齐全,主体框架展现清晰的django项目完成了!

相关文章
相关标签/搜索