Web应用和Web框架基础知识教程_web入门基础知识

一、Web应用1、什么是Web应用?Web应用程序是一种可以通过Web访问的应用程序,特点是用户很容易访问,只需要有浏览器即可,不需要安装其他软件。2、Web应用程序的模式应用程序有两种模式,即C/S、B/S两种,C/S是客户端/服务器端程序,这类程序一般独立运行;而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助谷歌,火狐等浏览器来运行。Web应

Web应用和Web框架基础知识教程

一、Web应用

1、什么是Web应用?
Web应用程序是一种可以通过Web访问的应用程序,特点是用户很容易访问,只需要有浏览器即可,不需要安装其他软件。

Web应用和Web框架基础知识教程_web入门基础知识

2、Web应用程序的模式

应用程序有两种模式,即C/S、B/S两种,C/S是客户端/服务器端程序,这类程序一般独立运行;而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助谷歌,火狐等浏览器来运行。Web应用程序一般是B/S模式。在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端。

3、实例

import socket   # 导入模块

def handle_request(client):
    request_data = client.recv(1024)  # 接收数据
    print(‘request data:‘,request_data)
    client.send(‘HTTP/1.1 200 OK\r\n\r\n‘.encode(‘utf8‘))  # 发送请求
    client.send("<h1 style=‘color:blue‘>Hello world</h1>".encode(‘utf8‘)) 


def main():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 实例化
    sock.bind((‘localhost‘,8800)) # 指定连接的服务器及端口
    sock.listen(5)  # 监听

    while True:
        print(‘waiting....‘)
        connection,address = sock.accept()  # 收到数据
        handle_request(connection)  #处理连接
        connection.close()  # 关闭连接

if __name__ == ‘__main__‘:
    main()

 

二、Web框架

1、什么是Web框架?

Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。

2、Web框架的特点

大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法,并且实现了许多功能,开发人员使用框架提供的方法可以更快完成自己的业务逻辑,快速开发web应用,避免反复造轮子,节省了许多时间和精力,大大提高了开发的效率。

 

三、wsgiref模块

(1)wsgi协议

wsgi协议简单理解,就是wsgi server调用wsgi application接口的约定,即当有个请求到达wsgi server时,wsgi server通过调用wsgi application提供的接口来处理这个请求。

(2)wsgiref模块

wsgiref模块是由server和handler组成,server用于监听端口,接收请求;handler用于处理请求。

(3)wsgiref简单示例

#!/usr/bin/env python3
#!-*- coding:utf-8-*-
# write by cc

from wsgiref.simple_server import make_server

def application(environ,start_response):
    # environ : 按照http协议解析数据,解析后的数据格式为字典
    # start_response : 按照http协议的格式组装数据
    print(environ,type(environ)) # <class ‘dict‘>
    # return [b"<h1>Hello Web</h1>"] # 返回的格式必须是列表,内容必须是二进制数据
    path = environ.get("PATH_INFO")  # 获取当前路径
    start_response(‘200 Ok‘,[(‘Content_Type‘,‘text/html‘)]) #
    if path == ‘/index‘:
        with open(‘index.html‘,‘r‘) as f:
            data = f.read()
    elif path == ‘/login‘:
        with open(‘login.html‘,‘r‘) as f:
            data = f.read()

    return [data.encode(‘utf-8‘)]

‘‘‘
 environ = {‘ALLUSERSPROFILE‘: ‘C:\\ProgramData‘, ‘APPDATA‘: ‘C:\\Users\\CC9102\\AppData\\Roaming‘, ‘COMMONPROGRAMFILES‘: ‘C:\\Program Files\\Common Files‘, ‘COMMONPROGRAMFILES(X86)‘: ‘C:\\Program Files (x86)\\Common Files‘, ‘COMMONPROGRAMW6432‘: ‘C:\\Program Files\\Common Files‘, ‘COMPUTERNAME‘: ‘DESKTOP-3UMV17V‘, ‘COMSPEC‘: ‘C:\\Windows\\system32\\cmd.exe‘, ‘DRIVERDATA‘: ‘C:\\Windows\\System32\\Drivers\\DriverData‘, ‘FPS_BROWSER_APP_PROFILE_STRING‘: ‘Internet Explorer‘, ‘FPS_BROWSER_USER_PROFILE_STRING‘: ‘Default‘, ‘HOMEDRIVE‘: ‘C:‘, ‘HOMEPATH‘: ‘\\Users\\CC9102‘, ‘LOCALAPPDATA‘: ‘C:\\Users\\CC9102\\AppData\\Local‘, ‘LOGONSERVER‘: ‘\\\\DESKTOP-3UMV17V‘, ‘NUMBER_OF_PROCESSORS‘: ‘4‘, ‘ONEDRIVE‘: ‘C:\\Users\\CC9102\\OneDrive‘, ‘ONEDRIVECONSUMER‘: ‘C:\\Users\\CC9102\\OneDrive‘, ‘OS‘: ‘Windows_NT‘, ‘PATH‘: ‘D:\\python37\\;D:\\python37\\Scripts\\;D:\\python27\\;D:\\python27\\Scripts;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;D:\\UltraEdit;D:\\Calibre\\;C:\\Users\\CC9102\\AppData\\Local\\Microsoft\\WindowsApps;D:\\Bandizip\\‘, ‘PATHEXT‘: ‘.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW‘, ‘PROCESSOR_ARCHITECTURE‘: ‘AMD64‘, ‘PROCESSOR_IDENTIFIER‘: ‘Intel64 Family 6 Model 61 Stepping 4, GenuineIntel‘, ‘PROCESSOR_LEVEL‘: ‘6‘, ‘PROCESSOR_REVISION‘: ‘3d04‘, ‘PROGRAMDATA‘: ‘C:\\ProgramData‘, ‘PROGRAMFILES‘: ‘C:\\Program Files‘, ‘PROGRAMFILES(X86)‘: ‘C:\\Program Files (x86)‘, ‘PROGRAMW6432‘: ‘C:\\Program Files‘, ‘PSMODULEPATH‘: ‘C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules‘, ‘PUBLIC‘: ‘C:\\Users\\Public‘, ‘PYCHARM_HOSTED‘: ‘1‘, ‘PYTHONIOENCODING‘: ‘UTF-8‘, ‘PYTHONPATH‘: ‘E:\\PyCharmFiles‘, ‘PYTHONUNBUFFERED‘: ‘1‘, ‘SESSIONNAME‘: ‘Console‘, ‘SYSTEMDRIVE‘: ‘C:‘, ‘SYSTEMROOT‘: ‘C:\\Windows‘, ‘TEMP‘: ‘C:\\Users\\CC9102\\AppData\\Local\\Temp‘, ‘TMP‘: ‘C:\\Users\\CC9102\\AppData\\Local\\Temp‘, ‘USERDOMAIN‘: ‘DESKTOP-3UMV17V‘, ‘USERDOMAIN_ROAMINGPROFILE‘: ‘DESKTOP-3UMV17V‘, ‘USERNAME‘: ‘CC9102‘, ‘USERPROFILE‘: ‘C:\\Users\\CC9102‘, ‘WINDIR‘: ‘C:\\Windows‘, ‘SERVER_NAME‘: ‘DESKTOP-3UMV17V.DHCP HOST‘, ‘GATEWAY_INTERFACE‘: ‘CGI/1.1‘, ‘SERVER_PORT‘: ‘8080‘, ‘REMOTE_HOST‘: ‘‘, ‘CONTENT_LENGTH‘: ‘‘, ‘SCRIPT_NAME‘: ‘‘, ‘SERVER_PROTOCOL‘: ‘HTTP/1.1‘, ‘SERVER_SOFTWARE‘: ‘WSGIServer/0.2‘, ‘REQUEST_METHOD‘: ‘GET‘, ‘PATH_INFO‘: ‘/‘, ‘QUERY_STRING‘: ‘‘, ‘REMOTE_ADDR‘: ‘127.0.0.1‘, ‘CONTENT_TYPE‘: ‘text/plain‘, ‘HTTP_HOST‘: ‘127.0.0.1:8080‘, ‘HTTP_CONNECTION‘: ‘keep-alive‘, ‘HTTP_CACHE_CONTROL‘: ‘max-age=0‘, ‘HTTP_UPGRADE_INSECURE_REQUESTS‘: ‘1‘, ‘HTTP_USER_AGENT‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.134 Safari/537.36 Vivaldi/2.5.1525.40‘, ‘HTTP_ACCEPT‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3‘, ‘HTTP_ACCEPT_ENCODING‘: ‘gzip, deflate, br‘, ‘HTTP_ACCEPT_LANGUAGE‘: ‘zh-CN,zh;q=0.9‘, ‘wsgi.input‘: <_io.BufferedReader name=468>, ‘wsgi.errors‘: <_io.TextIOWrapper name=‘<stderr>‘ mode=‘w‘ encoding=‘UTF-8‘>, ‘wsgi.version‘: (1, 0), ‘wsgi.run_once‘: False, ‘wsgi.url_scheme‘: ‘http‘, ‘wsgi.multithread‘: True, ‘wsgi.multiprocess‘: False, ‘wsgi.file_wrapper‘: <class ‘wsgiref.util.FileWrapper‘>} <class ‘dict‘>

 ‘PATH_INFO‘: ‘/‘, ‘QUERY_STRING‘: ‘‘, ‘REMOTE_ADDR‘: ‘127.0.0.1‘,
 ‘CONTENT_TYPE‘: ‘text/plain‘,
 ‘HTTP_HOST‘: ‘127.0.0.1:8080‘,
 ‘HTTP_CONNECTION‘: ‘keep-alive‘, 
‘‘‘


# 封装socket(实例化一个socket对象,并传入参数)
httped = make_server("",8080,application)

# 等待用户连接,相当于 conn,addr = sock.accept(),用户连接后自动调用application方法
httped.serve_forever()

这个实例程序的过程就是这样几步:

注意两点:

第一点:environ为一个字典,保存系统变量以及请求相关属性,例如请求路径,请求参数,请求方法等等;start_response为函数,设置response的状态码和header,然后application函数的返回值为response的body。

第二点:response状态码设置为200时,表示请求成功,在headers添加返回数据类型为text/html,以及返回的response body为[b‘<h1>Hello web</h1>‘],返回的数据必须为二进制字符串。

海计划公众号
(0)
上一篇 2020/03/29 01:47
下一篇 2020/03/29 01:47

您可能感兴趣的内容

  • 前端需要了解的后端知识入门指南_前端小白知识

    一名有前端工程师,除了掌握自身知识体系外,在业余时间也应该了解下后端的知识时间,由于前端与后端工作是最最密切相关的,多学习些后端知识对自身也是大有好处的。1、后端语言后端语言用来写后台的三巨头:PHP、JAVA、ASP.NET三门语言各有特色,php轻量级开发,适合开发论坛和bbs的后台。java就不用说了,比较大型的项目的后台都是用java写的。工作的需求

    2020/04/03
  • Exif.js入门基础_在 node 和 浏览器中读取 EXIF 图片元信息的 JavaScript 库

    Exif.js入门基础 GitHub:https://github.com/exif-js/exif-js 简介描述:在 node 和 浏览器中读取 EXIF 图片元信息的 Jav…

    2020/03/06
  • web前端代码重构入门教程_重构使用攻略

    一、代码规范化1. 整理一套vscode中格式化配置,在页面保存时自动格式化,团队成员格式统一(搭配eslint)。2. 整理项目中的命名(不要嫌长,但也不能过于冗长,尽量能让人一眼看明白)1. 私有变量前加’_’
    2. 方法使用驼峰命名
    3. 组件大写开头的驼峰命名
    4. 样式’-‘连接
    5. 文件名统一3. html嵌套尽量少于5层,标签语义化。4. 规

    2020/03/23
  • jsoneditor菜鸟知识_JSON 在线编辑器插件

    jsoneditor菜鸟知识 官方网址:http://jsoneditoronline.org GitHub:https://github.com/josdejong/jsoned…

    2020/03/06
  • 浅谈如何使用Netty开发高性能的RPC服务器菜鸟教程网_Netty使用教程

    如何使用Netty进行RPC服务器的开发,技术原理涉及如下:1、定义RPC请求消息、应答消息结构,里面要包括RPC的接口定义模块,如远程调用的类名、方法名、参数结构、参数值等信息。2、服务端初始化的时候通过容器加载RPC接口定义和RPC接口实现类对象的映射关系,然后等待客户端发起调用请求。3、客户端发起的RPC消息通过网络,以字节流的方式发送给RPC服务端,

    2020/04/03
  • 理解Javascript的变量提升小白指南_变量指南攻略

    正文Javascript中的变量提升说的是在程序中可以在变量声明之前就进行使用:console.log(a); // undefined
    var a = 1;可以看到,在变量a声明之前我们可以正常调用a,代码的实际的表现更像是这样的:var a;
    console.log(a); // undefined
    a = 1;但实际上,代码并没有被改变,上面的代码只是

    2020/03/20
  • JS异常函数之箭头函数入门基础教程_函数菜鸟知识

    在JS中,箭头函数可以像普通函数一样以多种方式使用。但是,它们一般用于需要匿名函数表达式,例如回调函数。下面示例显示举例箭头函数作为回调函数,尤其是对于map(), filter(), reduce(), sort()等数组方法。const scores = [ 1, 28, 66, 666];
    const maxScore = Math.max(…sc

    2020/03/26
  • XML可扩展标记语言入门基础教程_xml入门基础

    XML:可扩展标记语言,XML的标签是没有被定义过的,需要自行定义,宗旨是做数据传递,而不是做数据展示1、xml文件最顶端做声明2、所有标记必须成对出现(没有单标记)3、严格区分大小写4、允许嵌套,注意嵌套顺序5、每个标签允许自定义属性,格式与html一致,属性的值必须使用双引号括起

    2020/03/24
  • 14个Linux系统安全小妙招入门知识_安全指南教程

    对于互联网IT从业人员来说,越来越多的工作会逐渐转移到Linux系统之上,这一点,无论是开发、运维、测试都应该是深有体会。曾有技术调查网站W3Techs于2018年11月就发布一个调查报告,报告显示Linux在网站服务器的系统中使用率高达37.2%,这一数据也表明,Linux系统被广泛应用。其实,除了在网站服务器中的应用,Linux系统还被用于DNS域名解析

    2020/03/26
  • 关于 Redis 缓存的几道典型面试题!教程视频_面试入门攻略

    随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享一下Redis几道常见的面试题:缓存雪崩1.1 什么是缓存雪崩?如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。我们都知道Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Re

    2020/03/26
  • Js实现Call、apply、bind、Promise、Object.create、new、reduce基础指南_bind小白攻略

    手动实现Call这些API的特点以及具体用法我就不介绍了,相信你如果奔着手动实现的方向来看,那么你一定对它很了解核心: this永远指向最后调用它的对象代码:Function.prototype.myCall = function(context, …args) {context[‘key’] = this;context.key(…args);de

    2020/03/24
  • Service Worker的生命周期菜鸟教程_Worker基础入门

    Note: 翻译自 The Service Worker Lifecycle – by Jake Archibald, Jake Archibald参与了service worker标准的制定,也是该技术的推动者。(下文括号里的内容非作者原文)service worker的生命周期是它最复杂的部分。如果你不知道它在努力做什么和这么做的优势,你会感到它在跟你对

    2020/04/06
  • css使用到的border边框属性攻略教程_属性小白指南

    border 在一个声明中设置所有的边框属性。 border-bottom 在一个声明中设置所有的下边框属性。 border-bottom-color 设置下边框的颜色。 border-bottom-style 设置下边框的样式。 border-bottom-width 设置下边框的宽度。 border-color 设置四条边框的颜色。border-left

    2020/03/30
  • CSS如何实现背景透明教程视频css设置背景色透明度_透明小白攻略

    实现透明的css方法通常有以下3种方式,以下是不透明度都为80%的写法:css3的opacity:x,x 的取值从 0 到 1,如opacity: 0.8css3的rgba(red, green, blue, alpha),alpha的取值从 0 到 1,如rgba(255,255,255,0.8)IE专属滤镜 filter:Alpha(opacity=x)

    2020/04/05
  • EmojiOne 基础知识在线打包下载 Emoji 表情图标,提供 PNG、SVG、单色版和字体版等

    EmojiOne基础入门 官方网址:http://emojione.com/demo/ 简介描述:在线打包下载 Emoji 表情图标,提供 PNG、SVG、单色版和字体版等 Emo…

    2020/03/05
  • typescript开发环境搭建小白帮助_环境菜鸟教程

    ts为typescript的缩写,是javascript的超集。npm源改为国内由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源。npm config set registry https://registry.npm.taobao.org/执行下面的命令,确认是否切换成功。npm config get registry如果输出为 taob

    2020/03/23