开发者网络

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 71|回复: 1

web开发入门笔记

[复制链接]

1

主题

3

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-2-14 17:41:06 | 显示全部楼层 |阅读模式
之前没有做过web开发,正好工作中用到了,因此,把这两天学到的东西和自己的理解思路记下来。挺有趣的。加油~~
1、什么是web应用?

首先,需要知道应用有两种模式:C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行。WEB应用程序一般是B/S模式。它是典型的浏览器/服务器架构的产物。

2、web应用的工作流程是怎样的?

web应用的基本工作流程可以描述为以下4步:
1)浏览器发送一个HTTP请求;
2)服务器收到请求,生成一个HTML文档;
3)服务器把HTML文档作为HTTP响应的Body发送给浏览器;
4)浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

3、HTTP请求简介:

在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。浏览器和服务器之间的传输协议是HTTP。
http是一个简单的请求-响应协议,它是基于TCP协议的。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
3.1、请求   (Request)

请求头header一般用来存放一些cookie,token信息;请求体body一般用来存储post的参数和参数数据;
(1)Request Header最主要包括:
GET / HTTP/1.1
Host: www.sina.com.cn
解释:
「方法」GET是一种请求方式,是一个读取请求,常见的还有POST
「路径」/表示URL的路径,URL总是以/开头,/就表示首页
HTTP/1.1    指示采用的HTTP协议版本是1.1
「域名」host表示请求的域名是www.sina.com.cn。如果一台服务器有多个网站,服务器就需要通过Host来区分浏览器请求的是哪个网站。
3.2、响应    (Response)

(1)Response Header主要包括:
HTTP/1.1 200 OK
Content-Type: text/html
解释:
「响应代码」200 表示一个成功的响应,后面的OK是说明。失败的响应有404 Not Found:网页不存在,500 Internal Server Error:服务器内部出错,等等。
「响应类型」Content-Type指示响应的内容,这里是text/html表示HTML网页。请注意,浏览器就是依靠Content-Type来判断响应的内容是网页还是图片,是视频还是音乐。浏览器并不靠URL来判断响应的内容,所以,即使URL是http://example.com/abc.jpg,它也不一定就是图片。

(2)Respose Body就是HTML源码。
3.3、HTTP请求的流程

步骤1:浏览器首先向服务器发送HTTP请求,请求包括:
方法:GET还是POST,GET仅请求资源,POST会附带用户数据;
路径:/full/url/path;
域名:由Host头指定:Host: http://www.sina.com.cn
以及其他相关的Header;
(如果是POST,那么请求还包括一个Body,包含用户数据。)
步骤2:服务器向浏览器返回HTTP响应,响应包括:
响应代码:200表示成功,3xx表示重定向,4xx表示客户端发送的请求有错误,5xx表示服务器端处理时发生了错误;
响应类型:由Content-Type指定;
以及其他相关的Header;
通常服务器的HTTP响应会有Body,包含响应的内容,网页的HTML源码就在Body中。
步骤3:如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复步骤1、2。

Web采用的HTTP协议采用了非常简单的请求-响应模式,从而大大简化了开发。当我们编写一个页面时,我们只需要在HTTP请求中把HTML发送出去,不需要考虑如何附带图片、视频等,浏览器如果需要请求图片和视频,它会发送另一个HTTP请求,因此,一个HTTP请求只处理一个资源。

4、WSGI接口

4.1、为什么要用到WSGI接口?


一个Web应用的本质就是:

(1)浏览器发送一个HTTP请求;
(2)服务器收到请求,生成一个HTML文档;
(3)服务器把HTML文档作为HTTP响应的Body发送给浏览器;
(4)浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。
那么就可以用到WSGI啦~
正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。
这个接口就是WSGI:Web Server Gateway Interface。
可以理解为,WSGI将如何接受HTTP请求、解析HTTP请求、发送HTTP响应封装起来,对开发者透明,让开发者只需要实现其开发功能,考虑如何响应请求即可。

4.2、WSGI接口的基础代码的流程

一个简单的例子:
# hello.py
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'
上述例子的主要流程是:
接受environ(requeset信息)和start_response函数,功能是调用start_response进行响应,start_response的参数是response的header信息,return部分是response的body部分(即html页面)。

下面进行详细解释:
上面的application()函数就是符合WSGI标准的一个HTTP处理函数,
它接收两个参数:
environ:一个包含所有HTTP请求信息的dict对象;
start_response:一个发送HTTP响应的函数。
在函数体中调用start_response函数,就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()函数。start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。
通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。
然后,函数的返回值'<h1>Hello, web!</h1>'将作为HTTP响应的Body发送给浏览器。
这个例子太简单了?想更了解一些wsgi,还有复杂一点点的例子。
# hello.py
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web')
从environ里读取PATH_INFO,这样可以显示更加动态的内容。

好了,我们现在写一个脚本来启动WSGI服务器吧。
# server.py


from wsgiref.simple_server import make_server# 从wsgiref模块导入:
from hello import application        # 导入我们自己编写的hello.py中的application函数!!!

# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print "Serving HTTP on port 8000..."
# 开始监听HTTP请求:
httpd.serve_forever()
确保以上两个文件在同一个目录下,然后在命令行输入python server.py来启动WSGI服务器:
锵锵锵锵!效果如下:



5.web框架

5.1、为什么要使用web框架?

现在更进一步了,了解了WSGI框架,我们可以简单地认为:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应。
如何处理HTTP请求不是问题,问题是如何处理100个不同的URL。每一个URL可以对应GET和POST请求,当然还有PUT、DELETE等请求,但是我们通常只考虑最常见的GET和POST请求。
一个最简单的想法是从environ变量里取出HTTP请求的信息,然后逐个判断:
def application(environ, start_response):
    method = environ['REQUEST_METHOD']
    path = environ['PATH_INFO']
    if method=='GET' and path=='/':
        return handle_home(environ, start_response)
    if method=='POST' and path='/signin':
        return handle_signin(environ, start_response)
    ...但是这么写下去代码是肯定没法维护了。
这时web框架就派上用场啦。我们需要在WSGI接口之上能进一步抽象,让我们专注于用一个函数处理一个URL,至于URL到函数的映射,就交给Web框架来做。

5.2、有哪些常用的web框架?

目前主流的Web框架有:
Bottle:这是一个微框架,代码不到千行,不过很少有商业项目拿Bottle做开发的,一般用在个人等Demo项目中。
Django:这是Python界中最流行的Web框架,没有之一。很多大厂都在用,比如Instagram、Disqus,它是一个 All In One 的框架,从模板到ORM都是内嵌的,最大的特色是还自带Admin管理后台。把 models 定义好之后,就可以在后台管理数据了
Flask:它也是主流框架之一,它的特点是灵活性非常高,可以自定义模块。
Tornado:它的特点之一是异步Web框架,适合做长连接,它不仅是Web框架,还是一个Web Server,同时提供了异步库。
Sanic:它是一个类似Flask的异步web框架,基于Python3.5的 async/await 原生异步语法实现的。根据官方文档所说,性能非常高
目前只用到了flask,其余的没太多了解。
5.3、flask的使用

Flask通过Python的装饰器在内部自动地把URL和函数给关联起来,所以,我们写出来的代码就像这样:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
    return '<h1>Home</h1>'
@app.route('/signin', methods=['GET'])
def signin_form():
    return '''<form action="/signin" method="post">
              <p><input name="username"></p>
              <p><input name="password" type="password"></p>
              <p><button type="submit">Sign In</button></p>
              </form>'''
@app.route('/signin', methods=['POST'])
def signin():
    # 需要从request对象读取表单内容:
    if request.form['username']=='admin' and request.form['password']=='password':
        return '<h3>Hello, admin!</h3>'
    return '<h3>Bad username or password.</h3>'
if __name__ == '__main__':
    app.run()有了Web框架,我们在编写Web应用时,注意力就从WSGI处理函数转移到URL+对应的处理函数,这样,编写Web App就更加简单了。



6.gunicorn

6.1、什么是gunicorn?

Gunicorn是一个遵循WSGI协议的HTTP server。
6.1、为什么要用gunicorn做server?

gunicorn擅长于管理多进程,一般用来管理多个进程,有进程挂了Gunicorn可以把它拉起来,防止服务器长时间停止服务,还可以动态调整 worker的数量,请求多的时候增加 worker 的数量,请求少的时候减少,这就是所谓的 pre-fork 模型。
回复

使用道具 举报

2

主题

9

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 4 天前 | 显示全部楼层
发发呆,回回帖,工作结束~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|开发者网络

GMT+8, 2025-6-7 21:23 , Processed in 0.090084 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表