Django学习笔记(1)——初识Django

一:Web框架介绍

  框架,即framework,特指为解决一个开放性问题而设计的具备必定约束性的支撑结构,使用框架能够快速帮你开发特定的系统。html

  Web框架是别人已经设定好的一个web网站模板,你学习它的规则,而后“填空”或“修改”成你须要的样子。简单说,就是你用别人搭建好的舞台来表演。前端

  通常Web框架的架构这样的:python

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

  Web开发是Python语言应用领域的重要部分,也是工做岗位比较多的领域。若是你对基于Python的Web开发有兴趣,正打算开始学习使用Python作Web开发,或者已是一个Web开发者有工做须要,要作Web服务,自动化运维,数据的图形化展现等,那么学习一门基于Python的Web开发框架是必修课。nginx

二:都有那些框架?

  Python下有许多款不一样的Web框架。在其二十多年的历史中出现了数十种Web框架,好比Django,Tornado,Flask,Twisted,Bottle和Web.py等,他们历史悠久,有的发展迅速,还有的已经中止维护了。Django是重量级选手中最有表明性的一位。许多成功的网站和APP都基于Django。git

Django: Py Web应用开发框架
 
Diesel:基于Greenlet的事件I/O框架
 
Flask:一个用Py编写的轻量级Web应用框架
 
Cubes:轻量级Py OLAP框架
 
Kartograph.py:创造矢量地图的轻量级Py框架
 
Pulsar:Py的事件驱动并发框架
 
Web2py:全栈式Web框架
 
Falcon:构建云API和网络应用后端的高性能Py框架
 
Dpark:Py版的Spark
 
Buildbot:基于Py的持续集成测试框架
 
Zerorpc:基于ZeroMQ的高性能分布式RPC框架
 
Bottle: 微型Py Web框架
 
Tornado:异步非阻塞IO的Py Web框架
 
webpy: 轻量级的Py Web框架
 
Scrapy:Py的爬虫框架

  

三:为何选择Django?

  首先介绍一下Django,Django具备如下特色:程序员

  • 功能完善,要素齐全:该有的,能够没有的都有,自带大量经常使用工具和框架,无须你自定义,组合,增删及修改。
  • 完善的文档:通过十多年的发展和完善,Django有普遍的实践案例和完善的在线文档,开发者遇到问题时能够搜索在线文档寻找解决方案。
  • 强大的数据库访问组件:Django的Model层自带数据库ORM组件,使得开发者无需学习其余数据库访问技术(SQL,pymysql,SQLALchemy等)
  • 灵活的URL映射:Django使用正则表达式管理URL映射,灵活性高。新版的2.0,进一步提升了URL编写的优雅型。
  • 丰富的Template模板语言:相似jinjia模板语言,不但原生功能丰富,还能够自定义模板标签,而且与其ORM的用法很是类似。
  • 自带后台管理系统admin:只须要经过简单的几行配置和代码就能够实现一个完整的后台数据管理控制平台
  • 完整的错误信息提示:在开发调试过程当中若是出现运行错误或者异常,Django能够提供很是完整的错误信息帮助定位问题

四:基于Python进行Web开发的技术栈

  要想熟练地使用Django进行Web开发,设计生产环境可用的,可以应对必定规模访问量的Web应用,开发者要学会的远远不止Django自己。Python基础,环境搭建,前段语言,API设计,网站架构,系统管理,持续集成,服务化,数据处理,并发处理等等,都是相关的知识领域,包括但不限于如下的内容:github

  • 熟悉Python语言
  • 对前端HTML\CSS\JavaScript比较熟悉
  • 对网络基础,好比HTTP,TCP/IP等比较熟悉
  • 熟悉数据库,缓存,消息队列等技术的使用场景和使用方法
  • 平常能使用Linux或Mac系统工做(Windows属于标配)
  • 有性能优化经验,能快速定位问题

  除此以外,还要对业务有深入理解,可以写出可维护性足够高的代码。固然,以上都是对经验丰富的开发者而言,对于新手刚入门者,咱们朝着这个目标努力学习就好。web

下面是基于Python的Web开发技术栈:正则表达式

五: MVC/MTV介绍

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

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

  模型(model):定义数据库相关的内容,通常放在Models.py文件中。

  视图(view):定义HTML等静态网页文件相关,也就是那些HTML,CSS,JS等前端的东西。

  控制器(Controller):定义业务逻辑相关,就是咱们的主要代码。

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

 

Django的MTV模型组织

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

  通常是用户经过浏览器向咱们的服务器发起一个请求(request),这个请求回去访问视图函数,(若是不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,而后逐渐返回,视图函数把返回的数据填充到模板中,最后返回网页给用户。

 

咱们学习Django学习的是什么?

1,目录结构规范

2,urls路由方式

3,settings配置

4,ORM操做

5,模板渲染

6,其余

  Django是一个开放源代码的Web应用框架,由Python写成。

  Django遵照BSD版权,初次发布于2015年7月,并于2008年9月发布第一个正式版本1.0.

  Django采用了MVC的软件设计模型,即模型M,视图V和控制器C。

Django版本对应的Python版本:

准备知识:请求与相应的处理流程

  首先看一个流程图,这是咱们访问网站的流程图:

  用户在浏览器里输入网址(URL),回车以后就会向目标网址发送一个HTTP请求,服务器收到请求以后就会作出一个响应,把内容经过浏览器渲染出来,呈现给用户看。

  下图,就是请求响应的过程:

1,建立Django项目

1.1 使用Pycharm图形化界面建立

  这里推荐使用Pycharm,它功能强大,界面友好。

1,点击:file——》new project,出现下面的对话框。

  选择Django栏目,输入项目名称,这里采用国际惯例的mysite。选择Python解释器版本,点击create建立。

2,Django将自动生成下面的目录结构:

 

3,与项目同名的目录中是配置文件,templates目录是html文件存放也就是MTV中T。manage.py是Django项目管理文件。

1.2 使用terminal终端建立

  进入指定的项目保存目录,而后运行下面的命令:

django-admin startproject mysite

  这样就在目录下面生成一个mysite目录,也就是咱们的Django项目的根目录。它包含了一系列自动生成的目录和文件,具有各自专有的用途。

  注意:在给项目命名的时候必须避开Django和Python的保留关键字,好比“django”,“test”等,不然会引发冲突和莫名的错误。对于mysite的放置位置,不建议放在传统的/var/wwww目录下,它会具备必定的数据暴露危险,所以Django建议你将项目文件放在例如/home/mycode相似的位置。

  一个新建的项目结果大概以下(上面已经给出了,在这里再次展现,主要解释目录意义)

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

  各文件和目录解释:

  • 外层的mysite目录与Django无关,只是你项目的容器,能够任意命名。
  • manage.py:一个命令行工具,用于与Django进行不一样方式的交互脚本,很是重要,也是Django的管理主程序。
  • 内层的mysite/ 目录是真正的项目文件包裹目录,他的名字是你引用内部文件的包明,例如:mysite.urls。
  • mysite/__init__.py : 一个定义包的空文件。
  • mysite/settings.py : 项目的主配置文件
  • mysite/urls.py : 路由文件,全部的任务都是从这里开始分配,至关于Django驱动站点的内容表格。
  • mysite.wsgi.py : 一个基于WSGI的web服务器进入点,提供底层的网络通讯功能(一般不用关心)

2,建立APP

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

APP应用和project项目的区别

  • 一个APP实现某个功能,好比博客,公共档案数据库或者见到的投票系统
  • 一个project是配置文件和多个APP的集合,这里APP组合成整个站点
  • 一个project能够包含多个APP
  • 一个APP能够属于多个project

  全部的APP共享项目资源。

  APP的存放位置能够是任何地点,可是一般都将他们放在与manage.py脚本同级的目录下,这样方便导入文件。

  在pycharm下面的terminal终端中输入命令(pycharm中没有能够建立APP的图形化按钮,须要在终端中输入命令):

python manage.py startapp cmdb

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

 

3,编写路由

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

  简单的urls编写方法以下图:

 

4,编写业务处理逻辑

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

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

 

5,运行web服务

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

  命令行的运行方式为:

python manage.py runserver 127.0.0.1:8000

  命令行的展现以下:

可是在Pycharm中,咱们能够这样作:

1,在上步工具栏中找到下面图示的图标。

2,点击下拉箭头

 

3,点击edit Configurations

4,在host中输入:127.0.0.1   port中输入:8000.

5,OK以后,点击绿色的三角,web服务就运行起来了。

6,按图所示,自动跳转到浏览器程序页面。显示的倒是下图中的404页面:

,7,修改一下,添加“/index”,就一切OK了

 

  至此,一个最简单的Django编写的web服务器就启动成功了。

 

6,返回HTML文件

  上面咱们返回给用户浏览器的是什么?一个字符串!实际上这确定不行,一般咱们都是将HTML文件返回给用户。

1,下面咱们写这么一个index.html文件:

2,再修改一下views文件。

3,为了让Django知道咱们的HTML文件在哪里,须要修改settings文件的相应内容。可是默认状况下,它正好适用,你无需修改。

  接下来,咱们能够从新启动web服务。在浏览器刷新一下,你会看到带有样式的“hello world”

  注:这里有个小技巧,在多个频繁重启服务时,因为端口未释放的缘由,容易启动不了服务,修改一下端口就OK了。

4,结果以下:

 

7,使用静态文件

  咱们已经能够将HTML文件返回给用户了,可是还不够,前端三大块,HTML,CSS,JS还有各类插件,他们齐全才是一个完整的页面。在Django中,咱们将这些文件统称为“静态文件”,由于这些文件的内容基本是固定不变的,不须要动态生成,通常将静态文件放在static目录中。

  对于小项目,这些都不是问题,你能够将静态文件放在任何你的web服务器可以找到的地方。可是对于大型项目,尤为是那些包含多个APP在内的项目,处理那些由APP带来的多套不一样的静态文件是个麻烦问题。固然了这也正是django.contrib,staticfiles的用途,它收集每一个应用(和任何你指定的地方)的静态文件到一个统一指定的地方,而且易于访问。

7.1,在mysite中新建一个static目录。

  你的CSS,JS和各类插件均可以放置在这个目录里。

7.2,为了让Django找到这个目录,依然须要对settings进行配置。

7.3,一样在index.html文件中,能够引入js文件:

7.4,从新启动web服务,刷新浏览器,查看结果。(由于导入js文件,并无渲染,因此页面不变)

 7.5 静态文件的命名空间

  与模板相似,咱们能够将静态文件直接放在polls/static(而不是建立另一个polls子目录),但这其实是一个坏主意。Django将使用它所找到的第一个匹配的静态文件,若是在你的不一样应用中存在两个同名的静态文件,Django将没法区别他们。咱们须要告诉Django该使用其中的哪个,最简单的方法就是为他们添加命名空间。也就是说,将这些静态文件放在以他们所在应用的名字同名的另一个子目录下,也就是多建一层与应用同名的子目录。

  PS:良好的目录结构是每一个应用都应该建立本身的urls,views,models,templates和static,每一个templates包含一个与应用同名的子目录,每一个static也包含一个与应用同名的子目录。

7.6 直接访问静态文件

  实际上无论是在Django开发服务器上,仍是在nginx+uwsgi+django部署的服务器上,均可以经过url访问静态文件,不须要在Django中专门为每一个静态文件编写url路由和视图。

8,接受用户发送的数据

  上面,咱们将一个要素齐全的HTML文件返还给了用户浏览器。但这还不够,由于web服务器和用户之间没有动态交互。

  下面咱们设计一个表单,让用户输入用户名和密码,提交给index这个url,服务器将接收到这些数据。

1,先修改index.html文件

2,修改views.py文件

3,此时,重启web服务时,会出错,由于Django有一个csrf跨站请求保护机制,咱们暂时在settings文件中将其关闭,或者在form表单里添加一个‘{% csrf_token %}' 标签。这里为了演示方便,咱们采用临时关闭的方式。

   报错页面结果以下:

  命令行报错结果以下:

   在setting中将其注释,以下:

  再次进入浏览器,刷新页面

 输入用户名和密码,咱们能够在pycharm中看到相应的数据。

 

9,返回动态页面

   咱们收到了用户的数据,但返回给用户的依然是个静态页面,一般咱们会根据用户的数据,进行处理后再返回给用户。

  这时候,Django采用本身的模板语言,相似jinja2,根据提供的数据,替换掉HTML中的相应部分,详细语法之后再学习。

1,先改造views.py文件

2,再改造index.html文件:

 3,重启服务,刷新浏览器

  能够看到,咱们得到了用户实时输入的数据,并将它实时的展现在了用户页面上,这是一个不错的交互过程。

 

10,使用数据库

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

  上面咱们虽然和用户交互的很好,可是没有保留任何数据,页面一旦关闭,或者服务器重启,一切都将回到原点。

  使用数据库毫无疑问的,Django经过自带的ORM框架操做数据库,而且自带轻量级的sqlite3数据库,Django默认使用SQLite数据库,由于Python源生支持SQLite数据库,因此咱们无需安装任何程序,就能够直接使用,固然,若是咱们建立一个实际的项目,可使用相似PostgreSQL的数据库,避免之后数据库迁移的相关问题,下面咱们先看一下。

1,首先是注册app(打开mysite/settings.py配置文件,这是整个Django项目的设置中心):

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

默认状况,INSTALLED_APPS中会自动包含下列条目,它们都是Django自动生成的:

  • django.contrib.admin:admin管理后台站点
  • django.contrib.auth:身份认证系统
  • django.contrib.contenttypes:内容类型框架
  • django.contrib.sessions:会话框架
  • django.contrib.messages:消息框架
  • django.contrib.staticfiles:静态文件管理框架

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

  若是你想使用其余的数据库,请先安装相应的数据库操做模块,并将settings文件中DATABASES位置的'default'的键值进行相应的修改,用于链接数据库。

  • ENGINE(引擎):能够是django.db.backends.sqlite3,django.db.backends.postgresql,django.db.backends.mysql,django.db.backends.oracle,固然其余的也行。
  • NAME(名称):相似MySQL数据库管理系统中用于保存项目内容的数据库的名字。若是你使用的是默认的SQLite,那么数据库将做为一个文件存在你的机器中,此时的NAME应该是这个文件的完整绝对路径,默认值是 os.path.join(BASE_DIR, ’db.sqlite3’) ,将把该文件存储在你的项目目录下。

  若是你不是使用默认的SQLite数据库,那么一些诸如USER,PASSWORD和HOST的参数必须手动指定!下面给出一个基于pymysql操做Mysql数据库的例子,更多细节参考此博文

# mysite/settings.py

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

import pymysql         # 必定要添加这两行!经过pip install pymysql!
pymysql.install_as_MySQLdb()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'HOST': '192.168.1.1',
        'USER': 'root',
        'PASSWORD': 'pwd',
        'PORT': '3306',
    }
}

  

注意:

  • 在使用非SQLite的数据库时,请务必预先在数据库管理系统的提示符交互模式下建立数据库,你可使用命令:“CREATE DATABASE database_name;”。Django不会自动帮你作这一步工做。
  • 确保你在settings文件中提供的数据库用户具备建立数据库表的权限,由于在接下来的教程中,咱们须要自动建立一个test数据表。(在实际项目中也须要确认这一条要求。)
  • 若是你使用的是SQLite,那么你无需作任何预先配置,直接使用就能够了。

在修改settings文件时,请顺便将TIME_ZONE设置为国内所在的时区Asia/Shanghai

同时,请注意settings文件中顶部的INSTALLED_APPS设置项。它列出了全部的项目中被激活的Django应用(app)。你必须将你自定义的app注册在这里。每一个应用能够被多个项目使用,而且能够打包和分发给其余人在他们的项目中使用。

 

3,编辑models.py,也就是MTV中的M

  模型本质上就是数据库表的布局,再附加一些元数据。

  Django经过自定义Python类的形式来定义具体的模型,每一个模型的物理存在方式就是一个Python的类Class,每一个模型表明数据库中的一张表,每一个类的实例表明数据表中的一行数据,类中的每一个变量表明数据表中的一列字段。Django经过模型,将Python代码和数据库操做结合起来,实现对SQL查询语言的封装。也就是说,你能够不会管理数据库,能够不会SQL语言,你一样能经过Python的代码进行数据库的操做。Django经过ORM对数据库进行操做,奉行代码优先的理念,将Python程序员和数据库管理员进行分工解耦。

  这里咱们建立了两个字段,分别保存用户的名称和密码

4,咱们要在pycharm的teminal中经过命令建立数据库的表,有两条命令,分别是:

python manage.py makemigrations

  

  经过运行makemigrations命令,至关于告诉Django你对模型有改动,而且你想把这些改动保存为一个“迁移(migration)”。

  migrations是Django保存模型修改记录的文件,这些文件保存在磁盘上。在例子中,它就是polls/migrations/0001_initial.py,你能够打开它看看,里面保存的都是人类可读而且可编辑的内容,方便你随时手动修改。

  接下来有一个叫作migrate的命令将对数据库执行真正的迁移动做。

  再输入命令:

Python manage.py migrate

  migrate命令对全部还未实施的迁移记录进行操做,本质上就是将你对模型的修改体现到数据库中具体的表上面。Django经过一张叫作django_migrations的表,记录并跟踪已经实施的migrate动做,经过对比得到哪些migrations还没有提交。

  migrations的功能很是强大,容许你随时修改你的模型,而不须要删除或者新建你的数据库或数据表,在不丢失数据的同时,实时动态更新数据库。咱们将在后面的章节对此进行深刻的阐述,可是如今,只须要记住修改模型时的操做分三步

  • 在models.py中修改模型;
  • 运行python manage.py makemigrations为改动建立迁移记录;
  • 运行python manage.py migrate,将操做同步到数据库。

  之因此要将建立和实施迁移的动做分红两个命令两步走是由于你也许要经过版本控制系统(例如github,svn)提交你的项目代码,若是没有一个中间过程的保存文件(migrations),那么github如何知道以及记录、同步、实施你所进行过的模型修改动做呢?毕竟,github不和数据库直接打交道,也无法和你本地的数据库通讯。可是分开以后,你只须要将你的migration文件(例如上面的0001)上传到github,它就会知道一切。

  命令行结果以下:

   

  migrate命令将遍历INSTALLED_APPS设置中的全部项目,在数据库中建立对应的表,并打印出每一条动做信息。若是你感兴趣,能够在你的数据库命令行下输入:\dt (PostgreSQL)、 SHOW TABLES;(MySQL)或 .schema(SQLite) 来列出 Django 所建立的表。

  提示:对于极简主义者,你彻底能够在INSTALLED_APPS内注释掉任何或者所有的Django提供的通用应用。这样,migrate也不会再建立对应的数据表。

5,修改views.py中的业务逻辑

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

 

 

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

 

 

 

 

https://www.cnblogs.com/feixuelove1009/p/5823135.html

相关文章
相关标签/搜索