要基于编程开发一个完整的企业项目.不管什么样的项目,基本都有3种不同的开发模式,这几种开发模式,如果把项目类比成建造房子.则有如下:
- 原生开发.类似从0开始造房子,从0开始构建项目,什么东西都是自己实现的
- 敏捷开发, [基于框架,开发工具]从一个半成品开发到成品
- 二次开发, 从公司原有的项目,或者从开源项目中,进行改造,不需要的功能隐藏或者删除,没有的功能,进行开发集成.
django
Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。
Django 是一个开放源代码的 Web 应用框架,由 Python 写成。
Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。
Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pOFXETI-1605319045933)(django.assets/release-roadmap.688d8d65db0b.png)]
目前我们学习和使用的版本是2.2LTS版本,.
目前开源软件发布一般会有2个不同的分支版本:
1. 普通发行版本: 经常用于一些新功能,新特性,但是维护周期短,不稳定.
2. 长线支持版本[LongTerm Supper]: 维护周期长,稳定
官网: http://www.djangoproject.com
文档:https://docs.djangoproject.com/zh-hans/2.2/
在本地安装
pip install django==2.2.0
pip源:
https://pypi.douban.com/simple/ 豆瓣源
https://pypi.tuna.tsinghua.edu.cn/simple 清华源
使用格式:
pip install django==2.2.0 -i https://pypi.douban.com/simple/
当然在以后开发或者学习中,我们肯定都会遇到在一台开发机子中,运行多个项目的情况,有时候还会出现每个项目的python解析器或者依赖包的版本有差异.
这个时候,我们如果要安装多个不同的版本的模块或者解析器,.最好采用虚机环境[Virtualenvs]来开发.
pip install virtualenv
pip install virtualenvwrapper
pip install virtualenvwrapper-win
使用命令:
命令 | 参数选项 | 描述 |
---|---|---|
workon | 列出当前系统中所有的虚拟环境 | |
workon <虚拟环境名称> | 进入执行名称的虚拟环境中 | |
mkvirtualenv <虚拟环境名称> | -p 指定python解析器版本 | 创建一个指定名称的虚拟环境 |
deactivate | 在虚拟环境内部退出环境 | |
pip freeze | 列出当前环境下开发者使用pip安装的包列表,作用类似于pip list,但是比pip list好用 | |
pip freeze > ./requriments.txt | requriments.txt是瞎写的.不是固定 | 备份虚拟环境中的所有依赖包列表 |
pip install -r ./requriments.txt | 还原备份的虚拟环境包列表 | |
rmvirtualenv <虚拟环境名称> | 删除指定名称的虚拟环境[慎重使用,删除前建议备份] |
基于虚拟环境创建django项目并在pycharm中运行
创建虚拟环境并在虚拟环境中下载安装django包
mkvirtualenv dome
pip install django==2.2.0 -i https://pypi.douban.com/simple/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s05vE0Jp-1605319045937)(django.assets/1604737147038.png)]
通过pycharm打开项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ei6rhIzg-1605319045940)(django.assets/1604737237219.png)]
在pychatm中配置运行当前项目的python解析器.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctgjPv4f-1605319045945)(django.assets/1604737302001.png)]
设置完成了以后,直接直接下pycharm下面的终端terminal中使用命令运行django
python manage.py runserver
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiDSJOJ5-1605319045948)(django.assets/1604737352356.png)]
在浏览器中访问显示的地址http://127.0.0.1:8000
.效果如下则表示正确安装了.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AK0IINRb-1605319045950)(django.assets/1604737396784.png)]
当然如果每次运行项目都要在终端下输入命令的话,很麻烦,这时候我们可以借助pycharm直接自动运行这段命令.当然,这个需要我们在pycharm配置一下的.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OC3mPPj-1605319045956)(django.assets/1604737500628.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7S38JL9-1605319045959)(django.assets/1604737537897.png)]
可以在runserver 参数后配置修改django监听的端口和IP地址,当然,只能是127.0.0.1对应的其他地址.不能是任意IP.否则无法运行或访问!!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSyql1OS-1605319045962)(django.assets/1604737556681.png)]
django的目录结构
│─ manage.py # 终端脚本命令,提供了一系列用于生成文件或者目录的命令,也叫脚手架
└─ dome/ # 主应用开发目录,保存了项目中的所有核心代码,目录是生成项目时指定的
│- settings.py # 默认开发配置文件
│- urls.py # 路由列表目录,用于绑定视图和url的映射关系
│- wsgi.py # wsgi就是项目运行在wsgi服务器时的入门文件,相当于manage.py
└- __init__.py
快速使用django
在django中要提供数据展示给用户,我们需要完成3个步骤.
1. 创建子应用
2. 在子应用的视图文件中编写视图函数
3. 把视图和url进行绑定注册到django项目.
用户就可以通过url地址访问,用户访问的时候,django自动根据url地址执行对应的视图函数
1. 创建子应用
python manage.py startapp 子引用名称
子应用的名称将来会作为目录名而存在,所以不能出现特殊符号,不能出现中文等多字节的字符.
2. 在子应用的视图文件中编写视图函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyZlMiYu-1605319045964)(django.assets/1604738544521.png)]
home/view.py
,代码:
from django.http.response import HttpResponse
def index(request):
print("视图运行了")
return HttpResponse("hello world!")
3. 绑定路由
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eb1RCOCX-1605319045966)(django.assets/1604738621607.png)]
demo/urls.py
代码:
from django.contrib import admin
from django.urls import path
from home.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path("index", index),
]
因为上面我们绑定index视图函数的url地址是index,所以我们可以通过http://127.0.0.1:8000/
拼接url地址index
来访问视图函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fjTMgVj-1605319045967)(django.assets/1604738714168.png)]
上面的过程,我们就可以展示数据给客户端浏览器了.但是这个过程发生了什么,怎么实现的?我们需要清晰2个概念.web服务器和路由
web服务器
web服务器,全称也叫`http web 服务器`,专门用于提供网页浏览服务器的一类软件.
可以通过各类语言使用代码开发.
我们执行manage.py文件中, 之所以用户能使用浏览器访问就是web服务器的功劳.
常见的web服务器软件:
nginx,apache,uwsgi,tomcat,iis, gunicorn
其中, uwsgi和gunicorn就是使用python开发的web服务器.
注意: 大部分的项目框架都有内置的测试web服务器.其中django框架就内置了python解析器提供的wsgiref模块,这个模块是python官方提供给开发者进行学习测试使用的.不能用于项目的线上环境中,
因为这个测试web服务器,性能不好,不支持多线程.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNG7uYWS-1605319045970)(django.assets/1604739501434.png)]
路由
Route路由, 是一种关系!!!
路由是把客户端请求的url地址和用户请求的应用程序[这里意指django里面的视图]进行一对一绑定映射的一种关系.
当然,在项目中,我们常常说的路由,一般是一个类. 这个类完成了路由的事情.
视图
django的视图主要有2种,分别是函数视图和类视图.现在刚开始学习django,我们先学习函数视图(FBV),后面再学习类视图[CBV]…
函数视图
django中所有的函数视图必须编写在子应用的views.py文件中.
from django.http.response import HttpResponse
def 函数视图名称(request):
# 代码
return HttpResponse("返回内容")
函数视图名称,同一个模块下不能重复,同时采用变量命名规则.
限制http请求
web项目运行在http协议下,默认肯定也支持用户通过不同的http请求发送数据来.
常用的http请求:
POST 添加/上传
GET 获取/下载
PUT/PATCH 修改,其中PUT表示修改整体数据,而PATCH表示修改部分数据
DELETE 删除,
django支持让客户端只能通过指定的Http请求来访问到项目的视图
home/views.py
,代码:
# 让用户发送POST才能访问的页面
from django.views.decorators.http import require_http_methods
@require_http_methods(["POST"])
def index2(request):
print("视图运行了!!")
return HttpResponse("ok")
路由绑定
demo/urls.py
,代码:
from django.contrib import admin
from django.urls import path
from home.views import index,index2
urlpatterns = [
path('admin/', admin.site.urls),
path("index", index),
path("index2", index2),
]
访问效果http://127.0.0.1:8000/index2
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KKFIagk-1605319045974)(django.assets/1604742982034.png)]
上面地址无法访问内容,就是因为我们在视图中设置了客户端只能通过POST请求访问当前视图,而用户默认通过浏览器进行访问地址,默认使用的是GET,所以出现无法访问情况.那么正常情况下,我们用户发送POST一般肯定通过使用html网页中的表单/js里面提供http请求的ajax才可以做到发送POST或GET或PUT/PATCH,而现在我们没有表单,因此我们可以安装一个postman的软件,这个软件类似浏览器但是功能比浏览器要强大,专门提供给开发人员免费使用的.
选择适合自己操作系统的postman软件
官网下载地址: https://www.postman.com/downloads/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmrozQjx-1605319045983)(django.assets/1604743289381.png)]
把post地址栏左边的http请求方法改成POST,点击右边的send
,访问http://127.0.0.1:8000/index2
,效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6uDC4Sm-1605319045985)(django.assets/1604743377116.png)]
上面出现一大堆提示,这个其实就已经访问到项目中了, 当然此处提示的CSRF其实是django为了保护网站安全设置一种安全访问机制.后面我们学习到,现在我们可以先打开demo/settings.py
配置文件中的47行附近处通过注释关闭掉这个功能先.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzTlKBfT-1605319045988)(django.assets/1604743522110.png)]
关闭了csrf防范功能以后,继续使用postman访问http://127.0.0.1:8000/index2
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HK5Udtee-1605319045991)(django.assets/1604743353332.png)]
设置路由绑定视图
经过上面的学习,我们可以发现,每次编写视图函数都需要到路由文件中进行地址绑定.
这个过程必须每次都要进行,但是随着项目的开发,以后我们的视图函数肯定是越来越多的.
为了保证将来视图函数太多导致,无法明确区分哪些路由属于哪一个子应用的.我们可以现在刚开始项目的时候,把路由放回到子应用目录下.
- 在子应用home下创建子路由文件,一般路由文件名建议是,
urls.py
- 把子应用home下面的视图绑定代码转到`home/urls.py
home/urls.py代码:
from django.urls import path
from . import views # from . import views 表示从当前文件的同级目录中导入views.py
urlpatterns = [ # django中的所有路由列表名字必须叫 urlpatterns = []
# path("url地址", 函数视图名称 ),
path("index", views.index ),
path("index2", views.index2),
]
- 在总路由中
dome/urls.py
中通过include加载路由文件到django项目中
demo/urls.py代码:
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
# path('路由前缀', include("子应用目录名.路由文件名")),
path('admin/', admin.site.urls),
path('home/', include('home.urls')),
]
当django项目中的路由分成总路由和子应用路由以后, 那么用户访问视图,则访问地址的规则:
http://127.0.0.1:8000/路由前缀+子应用路由的url地址
例如: 总路由中注册子应用路由时, 路由前缀为 “home”
子路由文件中有一个函数视图的url地址为: “index”,
则用户访问时 正确的地址就是:
http://127.0.0.1:8000/homeindex
当然,如果路由前缀是 “home/”, 而子路由的url地址为 “index”\
则用户访问时 正确的地址就是:
http://127.0.0.1:8000/home/index
视图接收http请求
在http请求和响应过程中, 用户往往会在请求过程中发送请求信息给服务端.
1. 查询字符串[Query String]
所谓的查询字符串就是url地址上面?号后面的数据,例如:
http://127.0.0.1:8000/index?name=xiaoming&pwd=123456
上面name=xiaoming&pwd=123456就是查询字符串
2. 请求体数据
3. 上传文件
4. 请求头报文信息
获取查询字符串的参数
home/views.py
"""查询字符串[Query String]"""
def index3(request):
# print(request.GET)
"""
访问地址:
http://127.0.0.1:8000/home/index3
打印效果:
<QueryDict: {}>
分析: 通过request得到的客户端请求数据,基本都是会保存成QueryDict类字典给视图的,上面是空字典
QueryDict的声明位置: from django.http import QueryDict
QueryDict的父类继承的就是dict字典,所以字典提供的方法或者操作, QueryDict都有
"""
"""
访问地址:
http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678
打印效果:
<QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678']}>
分析:
这次就获取到了name和mobile参数以及参数的值
注意:
因为客户端传递过来的参数有可能多个值的情况,所以查询字符串返回的数据值都是列表格式
"""
"""
访问地址:
http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678&lve=swimming&lve=shopping&lve=game
打印效果:
<QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678'], 'lve': ['swimming', 'shopping', 'game']}>
分析:
因为lve有多个值的存在, 所以值就是列表中有3个成员
"""
"""获取QueryDict对象中的参数值"""
# 获取参数的一个值,或者第一个值
# 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
# print(request.GET.get("name"))
# print(request.GET["name"])
# 获取参数的所有值
print(request.GET.getlist("lve")) # ['swimming', 'shopping', 'game']
print(request.GET['lve']) # game,后面的值覆盖了前面的值
return HttpResponse("ok")
home/urls.py代码:
from django.urls import path
from . import views
urlpatterns = [
path("index", views.index ),
path("index2", views.index2 ),
path("index3", views.index3 ),
]