Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件
应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行。WEB应用程序一般是B/S模式。Web应用程序首先是“应用程序”,和用标准的程序语言,如C、C++等编写出来的程序没有什么本质上的不同。然而Web应用程序又有自己独特的地方,就是它是基于Web的,而不是采用传统方法运行的。换句话说,它是典型的浏览器/服务器架构的产物。
- 网络应用程序不需要任何复杂的“展开”过程,你所需要的只是一个适用的浏览器;
- 网络应用程序通常耗费很少的用户硬盘空间,或者一点都不耗费;
- 它们不需要更新,因为所有新的特性都在服务器上执行,从而自动传达到用户端;
- 网络应用程序和服务器端的网络产品都很容易结合,如email功能和搜索功能;
- 因为它们在网络浏览器窗口中运行,所以大多数情况下它们是通过跨平台使用的 (例如Windows,Mac,Linux等等)
- 网络应用程序强调浏览器的适用性。如果浏览器方没有提供特定的功能,或者弃用特定的平台或操作系统版本(导致不适用),就会影响大量用户;
- 网络应用依靠互联网远程服务器端的应用文件。因此,当连接出问题时,应用将不能正常使用。
- 许多网络应用程序不是开源的,只能依赖第三方提供的服务,因此不能针对用户定制化、个性化,而且大多数情况下用户不能离线使用,因而损失了很多灵活性;
- 它们完全依赖应用服务商的可及性。如果公司倒闭,服务器停止使用,用户也无法追索以前的资料。对比而看,即使软件制造商倒闭了,传统的安装软件也可以继续运行,尽管不能再更新或有其他用户服务;
- 相似地,提供方公司对软件和其功能有了更大的控制权。只要他们愿意就能为软件添加新特性,即使用户想等bugs先被解决再更新。跳过较差的软件版本也不可能了。公司可以强加不受欢迎的特性给用户,也可以随意减少带宽来削减开支。
公司理论上可以检索任何的用户行为。这有可能引起隐私安全问题。
# web应用程序是B/S架构的,我们需自己写一个服务端、然后让浏览器作为客户端即可
怎么样去写一个服务端? socket编程
# 在网址栏中输入什么后缀就返回什么后缀:
1. 服务端要知道你网址栏里输入的是什么后缀
2. 服务端做判断,然后做对应的返回# 存在的问题:
1. socket部分需要我们自己每次都要写
2. 我们需要自己每次处理HTTP格式的数据,自己转码、自己切分、自己取值等
3. 没有解决高并发问题优化问题------>wsgiref模块的使用
import socket server = socket.socket() server.bind(('127.0.0.1',7890)) server.listen(3) while True: # 等待客户端发来连接 sock,addr = server.accept() data = sock.recv(1024) # 网址栏输入什么后缀就返回什么后缀 print(data.decode('utf-8')) #二进制转字符串 str_data = data.decode('utf-8') lst_data = str_data.split(' ') print(lst_data) current_path = lst_data[1] # 给客户端返回消息 sock.send((b'HTTP/1.1 200 OK \r\n\r\n')) #TCP的流水协议,短时间内一次性接收多个数据 if current_path == 'index': sock.send(b'index') elif current_path == '/home': sock.send(b'home') # 存在问题:自己转码,自己切分,自己取值,没有解决高并发问题等等 sock.close()
HTTP协议的特性
1. 四大特性:* 基于请求响应
* 基于TCP协议之上的应用层协议
* 无状态
* 短链接
2. 请求数据格式:# 请求首行(请求方式、协议、版本号、路径)
# 请求头
# \r\n
# 请求体(get请求方式是没有请求体的、POST请求方式才有请求体)
3. 响应数据格式: * 响应首行()
* 响应头
* \r\n
* 响应体()
4. 响应状态码: 1xx、2xx、 3xx、 4xx、 5xx
wsgiref服务器---------->uwsgi服务器(uwsgi)-------->Nginx服务器+uwsgi服务器
# wsgiref模块是一个内置的模块,直接可以拿来使用,无需安装
# 它帮助我们封装了socket部分,也解决了部分的高并发问题,会帮我们把HTTP格式的数据 做封装处理,也就是说不需要我们在自己处理
views.py: 主要用来写业务逻辑的,它也称为是视图文件
def index():
with open('a.txt','r',encoding='utf-8')as f:
return f.read()
# def index():
# return 'from index'
def home():
return 'from home'
def login():
return 'from login'
def register():
return 'from register'
urls.py :主要用来写后缀和视图函数的对应关系,它也称为是路由文件
from views import *
urls = (
('/index',index),
('/home',home),
('/login',login),
('/register',register),
)
template:存储项目中用到的模板文件,html文件,模板文本,提供了一些模板语法.
"""每一个框架都应用有一个入口文件,Django也不例外"""
wsgiref模块:
from wsgiref.simple_server import make_server
from urls import urls
def run(env,response):
"""
:param env:请求来的时候,携带的请求数据都在这个里面
:param response:服务端给客户端响应的数据
:return:返回客户端显示的
"""
response('200 OK',[])
print(env)
current_path = env.get('PATH_INFO')
func = None
for url in urls:
if current_path == url[0]:
func = url[1] # 后缀对应的函数名
break
if func:
res=func()
return [res.encode('utf-8')]
else:
return [b'404 error']
if __name__ == '__main__':
sever = make_server('127.0.0.1',7000,app=run) # WSGIServer类的对象
"""
1、会实时监听'127.0.0.1':7890这个地址,只有客户端来连接就会做出响应
2、app=run:当有客户端请求过来的时候,会把该请求交给run函数来处理,不要加()
3、django中这里写的是函数名,当请求来的时候,会调用这个函数,函数加括号
4、如果是flask框架,app后写的是对象,当请求来时会交给这个对象处理,只不过变成了对象加括号
类()--->触发__init__执行
对象() --->实例化---->__call__的执行---->里面写的是falsk框架的源码入口位置
"""
sever.serve_forever() # 启动框架
# python中的主流框架:
Django框架:最主流的,市场占用率90%以上,笨重的,自带了很多模块,不适用于小项目
flask框架:轻量级的,小而美,自带功能比较少,需要安装很多第三方模块,当安装模块足 够多时,也跟Django差不多笨重了
torna框架:异步非阻塞,高性能、学这个框架成本高,解决并发量高,一般用于特殊场景
sanic框架
fastapi框架:主要用来写一些接口,不出来页面,只负责写业务逻辑## 主要就来学习Django的使用:
1. 需要先安装: pip install django
2. 版本的问题:
django1.x: 以前的老项目在使用,它跟2.x的版本区别不是特别大
django2.x:主流的项目使用的都是2.x的版本,有一点区别的跟1.x
django3.x: 新版本了,现在有不少的项目确实在选择3.x的版本
# 比如:drf框架要求django的版本必须是2以上,不支持1的版本3. django的版本要和你的Python的版本要匹配:
django2----->python3.6以上
django1----->python3.64. 如何创建django项目:# 先切换路径到你想存储的位置
命令行创建:
django-admin startproject 项目名称
django-admin startproject myfirstpycharm创建项目: File---->New project-----> django ...
5. 注意事项:
1. 项目名称必须是英文,不能是中文
2. 一个pycharm窗口只打开一个django项目6. 启动项目: # 先把路径切到跟manage.py同级目录下面
命令行启动:
python3 manage.py runserver
python3 manage.py runserver 80017. 创建应用:
python manage.py startapp 应用名
python manage.py startapp app01# 创建完应用之后,还要做一件非常重要的事情,就是注册应用
# 打不开的话,在setting里面设置
'DIRS': [os.path.join(BASE_DIR, 'templates')]
Django框架就类似于是一所大学,一所大学也要有二级学院
应用就类似于是二级学院,一个Django框架至少要有一个应用taobao
user
order
address
"""应用名要做到见名知意,符合变量的命名规则即可,但是,教学使用app01 02 03..."""
mysecond # 项目名称
app01 # 应用名称
migrations # 它是迁移数据的记录
__init__.py
admin.py # django自带的后台管理系统
apps.py # 暂且忽略,写一些注册的东西
models.py # 模型层,跟数据库打交道的,以后创建表就在这里写
tests.py # 测试脚本
views.py # 视图文件,主要用来写核心的业务逻辑的
mysecond
__init__.py
settings.py # Django的全局配置文件
urls.py # 路由文件,写地址的后缀和视图函数的对应关系
wsgi.py # wsgiref服务器
templates # 存储HTML文件的
db.sqlite3 # Django自带的小型数据库
manage.py # Django的启动文件,入口文件