目录
- 常见web框架介绍
- django介绍
- django 安装及初步建立
- app建立
Python 常见web框架
Django
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
2、Flask
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
Flask 很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。Flask 框架学会以后,可以考虑学习插件的使用。例如使用 WTForm + Flask-WTForm 来验证表单数据,用 SQLAlchemy + Flask-SQLAlchemy 来对你的数据库进行控制。
3、Tornado
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架
django介绍
- web框架: 别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。
常见web框架的架构
- mvc架构
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中mvc模式
目录分开,就必须有机制将他们在内里进行耦合。在Django中,urls、orm、static、settings等起着重要的作用。一个典型的业务流程是如上图所示:django 安装及初步建立
cmd中执行
pip install django
复制代码
安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py. 注意添加环境目录
新建项目
django-admin.py startproject HelloWorld
复制代码
项目结构
$ cd HelloWorld/
$ tree
.
|-- HelloWorld
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
`-- manage.py
复制代码
-
HelloWorld: 项目的容器。
-
manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
-
HelloWorld/init.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
-
HelloWorld/settings.py: 该 Django 项目的设置/配置。
-
HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
-
HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
项目启动
python manage.py runserver 0.0.0.0:8000
复制代码
建立app应用
项目和应用的区别是什么?App是一个可以做某些事的web 应用,例如博客系统,公共记录的数据库或者一个简单的投票应用。而Project是一个特定网站的配置和应用的集合。一个Project可以有多个app,一个app可以在多个project中。
在cmd中切换到存在manage。py的文件夹
python manage.py startapp appname
复制代码
app注册 APP应用创建后需要在项目的同名文件夹中的 settings.py 文件中注册:
url路由分发
视图
视图一般都写在 app 的 views.py 中。并且视图的第一个参数永远都是 request (一个 HttpRequest)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息 等。在视图中,一般是完成逻辑相关的操作。比如这个请求是添加一篇博客,那么可以通过 request来接收到这些数据,然后存储到数据库中,最后再把执行的结果返回给浏览器。
from django.http import HttpResponse
def book_list(request):
return HttpResponse("书籍列表!")
复制代码
url映射
视图写完后,要与URL进行映射,也即用户在浏览器中输入什么 url 的时候可以请求到这个视图 函数。在用户输入了某个 url ,请求到我们的网站的时候, django 会从项目的 urls.py 文件中 寻找对应的视图。在 urls.py 文件中有一个 urlpatterns 变量,以后 django 就会从这个变量中 读取所有的匹配规则。匹配规则需要使用 django.urls.path 函数进行包裹,这个函数会根据传入 的参数返回 URLPattern 或者是 URLResolver 的对象。示例代码如下:
from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list)
]
复制代码
url参数
有时候, url 中包含了一些参数需要动态调整。比如简书某篇文章的详情页的url, 是 www.jianshu.com/p/a5aab9c49… 后面的 a5aab9c4978e 就是这篇文章的 id ,那么简 书的文章详情页面的url就可以写成 www.jianshu.com/p/ ,其中id就是文章的id。那么 如何在 django 中实现这种需求呢。这时候我们可以在 path 函数中,使用尖括号的形式来定义一 个参数。比如我现在想要获取一本书籍的详细信息,那么应该在 url 中指定这个参数。示例代码 如下:
from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book/<book_id>/',views.book_detail)
]
复制代码
而 view.py 中代码
def book_detail(request,book_id):
text = "您输入的书籍的id是:%s" % book_id
return HttpResponse(text)
复制代码
Django支持三种表达route:
1、 精确字符串格式:articles/2017/
一个精确URL匹配一个操作函数;最简单的形式,适合对静态URL的响应;URL字符串不以“/”开头,但要以“/”结尾
2、 Django的转换格式:<类型:变量名>, articles/<int:year>/ 是一个URL模版,匹配URL同时在其中获得一批变量作为参数;是一种常用形式,目的是通过URL进行参数获取和传递
-
Str 匹配除分隔符(/)外的非空字符,默认类型等价于str:year
-
Int 匹配0和正整数
-
Slug 匹配字母、数字、横杠、下划线组成的字符串,str的子集
-
Uuid 匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00
-
path 匹配任何非空字符串,包括路径分隔符,是全集.
模板机制
在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的 页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面。目前市面上有非常多 的模板系统,其中最知名最好用的就是DTL和Jinja2。 DTL 是 Django Template Language 三个单 词的缩写,也就是Django自带的模板语言。当然也可以配置Django支持Jinja2等其他模板引擎,但 是作为Django内置的模板语言,和Django可以达到无缝衔接而不会产生一些不兼容的情况。因此 建议大家学习好DTL。
返回模板
DTL与普通的HTML文件的区别: DTL模板是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进 去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def head(request):
# return HttpResponse('hello,world')
return render(request,"form.html")
复制代码
模板语法
- 变量
模板中可以包含变量, Django 在渲染模板的时候,可以传递变量对应的值过去进行替换。变量的 命名规范和 Python 非常类似,只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符 号等特殊字符。变量需要通过视图函数渲染,视图函数在使用 render 或者 render_to_string 的 时候可以传递一个 context 的参数,这个参数是一个字典类型。以后在模板中的变量就从这个字 典中读取值的。示例代码如下:
# profile.html模板代码
<p>{{ username }}</p>
# views.py代码
def profile(request):
return render(request,'profile.html',context={'username':'huangyong'})
复制代码
模板中的变量同样也支持 点(.) 的形式。在出现了点的情况,比如 person.username ,模板是按 照以下方式进行解析的:
- 如果 person 是一个字典,那么就会查找这个字典的 username 这个 key 对应的值。
- 如果 person 是一个对象,那么就会查找这个对象的 username 属性,或者是 username 这个 方法。
- 如果出现的是 person.1 ,会判断 persons 是否是一个列表或者元组或者任意的可以通过下标 访问的对象,如果是的话就取这个列表的第1个值。如果不是就获取到的是一个空的字符串。
常用标签
if for 等等吧,下次更新
数据库
orm 框架
ORM 模型一般都是放在 app 的 models.py 文件中。每个 app 都可以拥有自己的模型。并且如果 这个模型想要映射到数据库中,那么这个 app 必须要放在 settings.py 的 INSTALLED_APP 中进行 安装。以下是写一个简单的书籍 ORM 模型。示例代码如下:
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
author = models.CharField(max_length=20,null=False)
pub_time = models.DateTimeField(default=datetime.now)
price = models.FloatField(default=0)
复制代码
以上便定义了一个模型。这个模型继承自 django.db.models.Model ,如果这个模型想要映射到数 据库中,就必须继承自这个类。这个模型以后映射到数据库中,表名是模型名称的小写形式, 为 book 。在这个表中,有四个字段,一个为 name ,这个字段是保存的是书的名称, 是 varchar 类型,最长不能超过20个字符,并且不能为空。第二个字段是作者名字类型,同样也 是 varchar 类型,长度不能超过20个。第三个是出版时间,数据类型是 datetime 类型,默认是 保存这本书籍的时间。第五个是这本书的价格,是浮点类型。 还有一个字段我们没有写,就是主键 id ,在 django 中,如果一个模型没有定义主键,那么将会 自动生成一个自动增长的 int 类型的主键,并且这个主键的名字就叫做 id 。
映射模型到数据库中:
将 ORM 模型映射到数据库中,总结起来就是以下几步:
- 在 settings.py 中,配置好 DATABASES ,做好数据库相关的配置。
- 在 app 中的 models.py 中定义好模型,这个模型必须继承自 django.db.models 。
- 将这个 app 添加到 settings.py 的 INSTALLED_APP 中。
- 在命令行终端,进入到项目所在的路径,然后执行命令 python manage.py makemigrations 来 生成迁移脚本文件。
- 同样在命令行中,执行命令 python manage.py migrate 来将迁移脚本文件映射到数据库中。