目录
前言
Web框架本质
服务器和应用程序
基于第三方模块实现Web框架
Python三大主流Web框架
django
flask
tornado
Django框架介绍
安装
创建项目
创建App
目录介绍
运行项目
Django基础必备三件套
HttpResponse
render
redirect
Web框架本质
所谓的web框架就是一个C/S架构。
我们可以用socket来编写我们的服务端,那么客户端是我们的浏览器,当我们访问服务器资源的时候,服务器接收到请求,但是无法响应给客户端。
这是因为要发送的数据没有遵循http协议,在服务端添加http协议头之后可以进行访问
那么我们如果在网址后面加参数,比如127.0.0.1:8080/index 类似这种的,服务器也无法响应了,这时候我们可以利用wsgiref这个模块来接收客户端的参数获取用户的url参数信息,根据这个参数信息,我们可以定义一个urls.py路由文件,帮我们任务的分发,分发到views.py视图函数中,
视图函数中利用三板斧可以发送给前端信息,最终展示给客户端。
我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。
服务器和应用程序
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。
应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。
这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。
这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。
WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。
基于第三方模块实现Web框架
需要用到:
views.py:视图层,放置功能函数(视图函数)
urls.py:路由层,放的是路径后缀与视图函数的对应关系
templates:模板层,放的全是html文件
django
大型的框架,自带的组件和功能非常多
类似于航空母舰
强大的功能之外不足之处:比较笨重
socket服务器部分用的是别人的wsgiref
路由层自己实现
模板语法自己实现
flask
短小精悍,自带组件非常少
基本全部依赖于第三方组件
如果将flask所有第三方模块加起来,可以盖过django
socket服务器部分用的第三方模块werkzeug
路由层自己实现
模板语法利用第三方模块Jinja2
tornado
异步非阻塞的一个框架,可以用来开发游戏服务器,效率非常非常高。
socket服务器自己实现
路由层自己实现
模板语法自己实现
安装
安装Django之前注意:
安装直接用pip安装即可
pip3 install django==1.11.11
如何检验django是否安装成功
django-admin
创建项目
命令行创建项目:
django-admin startproject
pycharm创建项目:
创建App
python3 manage.py startapp app01
django是一个以开发app为主要功能的web框架
app就是application应用的意思
一个django项目就是一所大学(空的架子 本身没有任何功能),而app就类似于大学里面的各个学院。
一个app就对应一个具体的功能模块。
创建好的app需要在django配置文件中注册方可生效
注意
1.使用命令行创建项目不会自动帮你创建templates文件夹
2.配置文件中不会自动帮你书写templates文件路径
3.setting配置文件中也不会自动帮你加app,不会生效
setting配置文件:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config', # 如果新建的app没有,这里要加上
]
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',
],
},
},
]
目录介绍
mysite/
├── manage.py # 管理文件
└── mysite # 项目目录
├── __init__.py
├── settings.py # 配置
├── urls.py # 路由 --> URL和函数的对应关系
└── wsgi.py # runserver命令就使用wsgiref模块做简单的web server
运行项目
python manage.py runserver 127.0.0.1:8000
Django基础必备三件套
from django.shortcuts import HttpResponse,render,redirect
HttpResponse
内部传入一个字符串的参数,将会返回给浏览器
例如:
def index(request):
# 业务逻辑代码
return HttpResponse("正常访问了")
render
可以接收多个参数
第一个参数接收request
第二个参数填写一个待渲染的模板文件(html文件)
第三个参数写一个保存具体数据的字典
意思是将数据填充进模板文件,最后将结果返回给浏览器,类似于Jinja2模板,注意,这里的reder使用的模板语法,在html文件中可以使用python的字典语法取值,是python后端处理完成之后再发送到html的,最后才将结果返回给浏览器。
例如:
def index(request):
# 业务逻辑代码
return render(request,"index,html",{"name":"qinyj","hobby":["run","jump"]})
redirect
接收一个URL参数,意思是可以重定向到指定的URL地址
例如:
def index(request):
# 业务逻辑代码
return redirect("https://www.baidu.com")