django入门
一、 django框架导入
1. 什么是软件框架
软件框架(Software framework),软件框架其实就是将代码放到一个我们看不到的容器中,规定架构。当我们使用的时候直接调用。
2. python 网络编程复习(cs模型,bs模型)
cs模型: c --- client的意思 s --- server的意思
bs模型: b --- browser的意思 s --- server的意思
2.1框架的雏形
我们回顾以前我们所写的网络编程当中,tcp实现服务端的代码,它其实就是我们web后台服务的雏形,也就是说,无论什么样的web框架,都是由它而演化过来的。
1. from socket import*
2.
3. defhandler_client(client_socket):
4. # 就是客户端(浏览器给我们发送的请求)
5. request = client_socket.recv(1024)
6. print(request)
7.
8. #就是服务器给浏览器返回的相应信息 response
9. client_socket.send(b'HTTP/1.1 200 OK\r\n\r\n')
10. client_socket.send(b'i love you!')
11.
12. defmain():
13. #创建socket 就是买来一部手机
14. myscoket = socket(AF_INET,SOCK_STREAM)
15. #给手机办卡
16. myscoket.bind(('',8888))
17. #设置手机最大监听数
18. myscoket.listen(5)
19. whileTrue:
20. #等待链接,等人给打电话
21. client_socket,client_info = myscoket.accept()
22. handler_client(client_socket)
23. client_socket.close()
24.
25. #只有当此脚本文件执行的时候,才会调用main函数,如果作为模块去引用,main函数不执行
26. if __name__ =='__main__':
27. main()
2.2网址url的详解
我们发现,当我们输入127.0.0.1:8888,我们看到了我们返回的信息I love you!,然后我们模仿其它的网站,给这个ip和端口后面加上一个/news/,发现也是可以返回I love you!因此,我们就要思考一个问题了:为什么在点击别人网站内链接的时候,url域名没变,后面路径发生变化就会返回不同的网页信息,而我们的也换了别的路径,怎么就不行呢?
首先:我们应该解决的一个问题就是url的问题,那么什么是url呢?
url: 统一资源定位符。是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名.
例如:下面是新浪财经网,那么这个url的基本组成就是三个部分
第一部分:http代表协议
第二部分:finance.sina.com.cn 代表域名,也就是新浪财经web服务的ip和端口
第三部分:路径,看起来貌似什么都没有,其实它是‘/’代表根路径
其次:我们还要了解一点,当协议、IP、端口如果都相同,那么就是说明我们请求的是同一个网站后台。我们接着点击这个网页上的股票和期货。发现url分别为http://finance.sina.com.cn/stock/和http://finance.sina.com.cn/futuremarket/,果然,协议、ip和端口都没变,仅后面的路径发生变化,就返回了网站上不同的页面信息。
最终我们可以肯定的得到一个结论:
当输入http://finance.sina.com.cn/返回新浪财经网站的首页
当输入http://finance.sina.com.cn/stock/返回新浪财经网站的股票相关信息
当输入http://finance.sina.com.cn/futuremarket/返回新浪财经网站的期货信息
2.3完善框架雏形代码
当我们把新浪财经网站分析过后,并且把url搞清楚后,惊讶的发现,原来网站返回信息的不同是根据路径来的,也就是说,路径决定了返回的内容。而我们只是在浏览器上输入了不通的路径,在我们的后台雏形代码当中没有根据路径返回不同信息的这个体现,因此,我们接着去完善我们的雏形代码。
我们将我们初始的雏形代码里面handler_client函数内,使用伪代码修改如下
defhandler_client(client_socket):
# 就是客户端(浏览器给我们发送的请求)
request = client_socket.recv(1024)
print(request)
# 伪代码:
if路径=='/':
function1()
if路径=='/news/':
function2()
if路径=='/girls/':
function3()
deffunction1():
client_socket.send(b'HTTP/1.1 200 OK\r\n\r\n')
client_socket.send(b'返回首页!')
deffunction2():
client_socket.send(b'HTTP/1.1 200 OK\r\n\r\n')
client_socket.send(b'新闻')
deffunction3():
client_socket.send(b'HTTP/1.1 200 OK\r\n\r\n')
client_socket.send(b'美女')
这样的话,在我们修改完成后,我们的雏形代码就 会有判断路径,并且根据路径不同调用不同的函数去返回不同的信息这个功能了
2.4从雏形代码当中抽象出框架
这样的话,我们就可以试图将固定的东西全部去封装为框架的一部分,不能封装的我们也尽可能的去做到按照功能和作用,独立,作为配置文件或者专用的文件。如下图所示:
到此为止,我们已经自己实现了简单的框架结构。只是我们在实现的时候,返回的是固定的数据,并没有用到数据库当中的数据,也没有返回网页页面的数据,如果加上之后,那么我们不但实现了简单的框架结构,并且这个结构还遵循闻名中外的MVC模式。
3. MVC和MTV简介
3.1、MVC简介:
1)大部分开发语言中都有MVC框架
2)MVC框架的核心思想是:解耦
3)降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
4)m表示model,主要用于对数据库层的封装
5)v表示view,用于向用户展示结果
6)c表示controller,是核心,用于处理请求、获取数据、返回结果
3.2、MTV简介:
1)Django是一款python的web开发框架
2)与MVC有所不同,属于MTV框架,MTV是根据MVC变异而来
3)m表示model,负责与数据库交互
4)v表示view,是核心,负责接收请求、获取数据、返回结果
5)t表示template,负责呈现内容到浏览器
二、 搭建开发环境过程
1. Virtualenv的安装
virtualenv 是一个创建隔绝的Python环境的工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包。
1.1 安装Virtualenv
升级
pip
命令:
sudo pip3 install --upgrade pip
安装命令:
sudo pip3 install virtualenv
安装Virtualenv
1.2 基本使用
1.2.1 为一个工程创建一个虚拟环境:
$ cd myproject
#venv
为虚拟环境目录名,目录名自定义
$ virtualenv venv
virtualenv venv 将会在当前的目录中创建一个文件夹,包含了Python可执行文件,以及 pip
库的一份拷贝,这样就能安装其他包了。虚拟环境的名字(此例中是 venv
)可以是任意的;若省略名字将会把文件均放在当前目录。
在任何你运行命令的目录中,这会创建Python的拷贝,并将之放在叫做 venv 的文件中。
1.2.2 你可以选择使用一个Python解释器:
$ virtualenv -p /usr/bin/python2.7 venv
# -p
参数指定
Python
解释器程序路径
virtualenv -p /usr/bin/python3.5 python3
这将会使用 /usr/bin/python2.7
中的Python解释器。
1.2.3 要开始使用虚拟环境,其需要被激活:
source venv/bin/activate
从现在起,任何你使用pip安装的包将会放在 venv 文件夹中,与全局安装的Python隔绝开。
像平常一样安装包,比如:
$ pip install requests
1.2.4 如果你在虚拟环境中暂时完成了工作,则可以停用它:
$ deactivate
这将会回到系统默认的Python解释器,包括已安装的库也会回到默认的。
要删除一个虚拟环境,只需删除它的文件夹。(执行 rm -rf venv )。
1.2.5 删除创建的虚拟环境
rm -rf venv
这里virtualenv有些不便,因为virtual的启动、停止脚本都在特定文件夹,可能一段时间后,你可能会有很多个虚拟环境散落在系统各处,你可能忘记它们的名字或者位置。
2.virtualenvwrapper
2.1 virtualenvwrapper的安装
鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper。 virtualenvwrapper提供了一系列命令使得和虚拟环境工作变得便利。它把你所有的虚拟环境都放在一个地方。
2.1.1 安装virtualenvwrapper(确保virtualenv已安装)
sudo pip3 install virtualenvwrapper pip install virtualenvwrapper-win
#Windows
使用该命令
2.1.2 在~/.bashrc写入以下内容
export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh
打开文件命令:sudo subl .bashrc
第一行:virtualenvwrapper存放虚拟环境目录
第二行:virtrualenvwrapper会安装到python的bin目录下,所以该路径是python安装目录下bin/virtualenvwrapper.sh
2.1.3 读入配置文件,立即生效
source ~/.bashrc#
读入配置文件,立即生效
virtualenvwrapper基本使用
2.2 创建虚拟环境mkvirtualenv
mkvirtualenv venv
这样会在WORKON_HOME变量指定的目录下新建名为venv的虚拟环境。
若想指定python版本,可通过"--python"指定python解释器
2.2.1 创建python3的虚拟环境
在任何目录执行下面命令:
mkvirtualenv --python=/usr/bin/python3.5 python3
查看创建的虚拟环境
退出虚拟环境
2.2.2 创建python2的虚拟环境
mkvirtualenv --python=/usr/bin/python2.7 python2
2.3 基本命令
2.3.1 查看当前的虚拟环境目录
[root@localhost ~]# workon
python2
python3
2.3.2 切换到虚拟环境
切换命令:
workon python3
如图:
2.3.3 退出虚拟环境
退出命令:deactivate
2.3.4 删除虚拟环境
命令:
rmvirtualenv python2
3. 虚拟环境管理常用命令
- 创建:mkvirtualenv [虚拟环境名称]
- 删除:rmvirtualenv [虚拟环境名称]
- 进入:workon [虚拟环境名称]
- 退出:deactivate
- 所有的虚拟环境,都位于/home/atguigu/Envs/目录下
3.1 进入虚拟环境前的提示
·
3.2 查看当前的所有虚拟环境:workon[两次tab键]
3.3 查看虚拟环境中已经安装的包
pip list
pip freeze
后面这张图是安装其他软件的时候执行的
4. 安装django
建议安装1.8.2版本,这是一个稳定性高、使用广、文档多的版本
并且在python3虚拟环境下
4.1 进入python3虚拟环境:workon python3
4.2 安装django1.8.2
pip3 install django==1.8.2
4.3 先安装ipython命令:pip3 install ipython
4.4 查看版本:进入pythonshell,运行如下代码
import django
django.get_version()
- 说明:使用pip3 install django命令进行安装时,会自动删除旧版本,再安装新版本
4.5 安装mysql驱动包
在 python2 中,使用 pip install mysql-python 进行安装连接MySQL的库,使用时 import MySQLdb 进行使用
在 python3 中,改变了连接库,改为了 pymysql 库,使用pip installpymysql 进行安装,直接导入即可使用
但是在 Django 中, 连接数据库时使用的是 MySQLdb 库,这在与 python3 的合作中就会报以下错误了
django.core.exceptions.ImproperlyConfigured:Errorloading MySQLdb module: No module named 'MySQLdb'
解决方式1:
在 __init__.py 文件中添加以下代码即可。
import pymysql
pymysql.install_as_MySQLdb() 顾名思义:让 Django 把 pymysql 当成 MySQLdb 来使用吧,但是这样的解决方式并不是一蹴而就,以后每个新项目当中我们都要去写上这两行代码,比较繁琐,不推荐
解决方式2:
安装另外一款可以替代MySQLdb的包,mysqlclient,但是这个包在windows下是完美支持的,如果要在linux下使用,需要先安装依赖包,在终端经过以下两个命令后,数据库完美解决问题,推荐使用。
sudo apt-getinstall python3-dev libmysqlclient-dev
pip install mysqlclient
三、 创建项目和应用
1. 常用命令
创建test1项目命令:django-adminstartproject test1
创建booktest应用命令:python3 manage.py startapp booktest
运行服务器命令:python3 manage.pyrunserver 8080
生成迁移文件命令:python3 manage.pymakemigrations
执行sql语句生成数据表命令:python3 manage.py migrate
创建一个管理员用户命令:python3 manage.py createsuperuser#按提示输入用户名、邮箱、密码
2. 创建项目和应用
1)、打开终端窗口
2)、进入到创建好的虚拟环境中 workon 虚拟环境名(python3)
3) 、找到提前创建好的项目管理文件夹 并且进入到这个文件夹中(例如,在~/Desktop下创建一个django项目管理文件夹)
4) 、在这个文件夹当中使用命令去创建我们的项目:
django-adminstartproject testdjango
创建好项目之后,查看,会看到我们的testdjango项目目录
5) 、项目创建成功后进入到项目目录当中,创建项目的第一个应用
pythonmanage.py startapp test1
创建好之后,我们可以查看在项目目录下有三个东西,两个目录,一个文件。
最终我们的项目层次结构如下
3. 项目目录文件详解
当我们打开一个新项目的时候,会看到项目文件夹当中默认有两个文件夹,一个文件夹名字和项目名字相同,一个文件夹就是我们创建好的第一个应用。除此以外还有一个py文件,manage.py.
· manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互。
· 内层的目录:项目的真正的Python包。
· _init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包。
· settings.py:项目的配置。
· urls.py:项目的URL声明,用来做url路由匹配。
· wsgi.py:项目与WSGI兼容的Web服务器入口。
4. 应用详解
4.1为什么要创建应用
我们可以打开任何的网站去看,基本上所有的网站都是由很多个模块组成的。例如以下这个电商网站,从首页我们是可以看出来,它不仅仅是一个模块组成,它至少包含了四个模块:用户模块、商品模块、购物车和订单模块。而这每一个模块都对应着一个应用。因此,我们要清楚,一个django的项目是基于应用(模块)来实现的,它至少要包含一个应用。这也是为什么我们在创建项目的时候就把第一个应用创建了出来。如果项目当中包含的不止一个模块应用,我们后续可以继续再创建。
4.2应用文件作用
每个应用里面都会有如下这些文件,他们都有各自的作用:
· admin.py:这个文件用于在admin后台注册模型类
· models.py:书写对应的数据库模型类
· views.py:用于书写我们的控制逻辑
· _init _.py:可以对应用进行初始化,可以让应用的目录作为包来使用
· tests.py:用来做测试使用
· migrations:用来存放数据模型迁移文件
四、 django http会话
1. 什么是http会话
https://baike.baidu.com/item/HTTP%E4%BC%9A%E8%AF%9D
2. django一次会话流程图
总而言之:一次http会话包含了四个过程:建立tcp连接;发出请求文档;返回响应文档;释放tcp连接,并且会话是无状态的。
3. django一次会话的实现(案例)
django处理会话三大步:
l 配路由
每个请求都会对应特定的路由,路由是在urls文件当中去配置
l 写视图
每个路由都会对应特定的处理函数(类),其实就是我们的view视图
l 返数据
每个处理函数(类)都会返回特定的响应信息(字符串,html内容,json)
django是用来做网站的,网站的基本组成是网页,而网页上又包含了一个或者多个会话,因此我们可以大胆断言,django就是用来处理这一个一个会话的(我们也可以这样理解:网页上包含了一个或者多个请求)。
我们可以一起实现第一个会话的流程代码
实现步骤:
1)、打开终端,进入到我们的虚拟环境python3
2)、在我们预先准备好的项目管理文件夹django下创建新的项目testdjango
3)、进入到我们的项目文件夹下创建我们第一个应用test1
4)、使用pycharm打开我们的项目
5)、在pycharm中将虚拟环境设置为我们的python3虚拟环境
6)、对项目进行基本设置settings
将我们第一个app添加到INSTALLED_APPS 中,如下:
7)、配置路由
在项目设置目录下,也就是和项目同名的那个目录下有个urls文件,这个就是我们的路由配置文件,在文件中会有这样的代码
urlpatterns就是我们的路由,我们可以在这个路由当中去配置我们的第一个路由,其实就是一个url方法,这个方法有四个参数
l 正则 浏览器网址输入网址发送请求后,会通过这个正则去匹配url中的路径
l view函数 如果正则匹配网址的路径成功就会把请求传给相对应的这个函数处理
l 可选参数 一般不用
l name 代表反向解析(软连接)名字
那么,我们就可以向,一般网站首页都是直接域名后面什么都没有就是返回首页,比如:https://www.baidu.com就是百度的首页,那么我们可以想象,在百度的后台肯定是有配置这个路径的,这个路径什么都没有,那么就是‘’空字符串,因此,我们可以尝试去配置我们的首页路由
如下:
8)、书写view视图处理函数
当我们配置好路由之后,假想我们现在的网站输入了一个域名,后面没有加任何的路径,那么代表是空,这样的话,首先请求进来会到我们的urls里面找路由,当然就找到我们刚才配置的路由,这样的话,正则进行验证,确实是匹配的。就会去找第二个参数,那么第二个参数就是我们要写的view视图函数,所以,我们接下来在应用当中,有个views.py文件,这个文件就是专门用来写视图处理函数的。因此,我们找到应用下的viws.py有了以下代码:
需要导入HttpResponse这个模块,进行返回数据
9)、urls导入书写的视图
最后,我们在urls当中导入我们刚写好的view视图index如下所示:
10)、运行我们的服务测试
运行服务两种方式,可以在终端中进入我们的项目,在项目文件夹下使用命令运行服务:python manage.py runserver
项目默认会在本机8000端口运行,效果如下
我们也可以在pycharm当中,点击工具栏当中的Run,运行我们的项目,效果如下:
按住ctrl点击http://127.0.0.1:8000,我们可以在浏览器上查看到如下效果:
至此:我们把第一个会话,就全部搞定。
4. 返回字符串和网页html数据
上面,我们通过一次会话,给浏览器返回了一句话,也就是一个字符串,假设,我们还想去返回一个html网页内容怎么去做呢,接下来,我们可以一起实现一下:
1)、如果要返回去带有动态数据的网页内容,我们需要用到模板,首先需要在项目目录下创建一个文件夹templates,这个名字不能变,用来存储我们的html页面,html页面就是我们所说的模板。而templates,就是我们的模板文件夹。
2)、在settings文件当中,设置模板路径,settings当中有一项专门设置模板路径的地方,如果我们是通过终端命令创建的项目,那么这一项是需要我们手动配置,如果我们是用pycharm创建的项目,可以设置自动创建templates文件夹和配置模板路径。
3)、配置好上面两项之后,我们就可以在templates文件夹下创建我们的html页面,并且通过我们的view视图函数返回这个页面。
要去返回这个页面,我们仅仅需要把view视图函数当中返回的HttpResponse对象,变成render对象即可,如下图所示
如果修改了django内部的代码并且正确无误,它会自动重启服务,我们只需要刷新我们浏览器页面即可,效果如下:
这样,我们就把一个html页面上的内容返回给浏览器了。
那么,最后我们可以思考下,假设我们在view视图函数当中,有数据,并且我们还想要返回页面,如何将数据和模板html文件内容一起返回浏览器呢?