zoukankan      html  css  js  c++  java
  • web 应用

     一、web应用

    web应用程序是一种可以通过web访问的应用程序,程序 的最大好处是用户很容易访问应用程序,用户只需要有浏览器 即可,不需要安装其他团建,用用程序有两种模式C/S、B/S。C/S是客户端/服务端程序,也就是说这类程序一般独立运行。而B/S就是浏览器/服务端应用程序,这类应用程序一般借助谷歌,火狐浏览器来运行,WEB应用程序一般是B/S模式,web应用程序首先是“应用程序”,和标准的程序语言,如java,Python等编写出来的程序没有什么本质上的不同,在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端。

    import socket
    
    def handle_request(client):
    
        request_data = client.recv(1024)
        print("request_data: ",request_data)
    
        client.send("HTTP/1.1 200 OK
    status: 200
    Content-Type:text/html
    
    ".encode("utf8"))
        client.send("<h1>Hello, luffycity!</h1><img src=''>".encode("utf8"))
    
    def main():
    
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('localhost',8812))
        sock.listen(5)
    
        while True:
            print("the server is waiting for client-connection....")
            connection, address = sock.accept()
            handle_request(connection)
            connection.close()
    
    if __name__ == '__main__':
    
        main()

    二、http协议

    http协议简介

    http协议是hyper text transfer protocol(超文本传输协议)的缩写,是用于万维网(www:world web)服务器与本地浏览器之间传输超文本的传送协议

    http协议是一个属于应用层的面相对象的协议,由于其简洁,快速 的方式,适用于分布式超媒体信息系统,它于1990年提出,经过几年的使用与发展,得到不断的完善和扩展,http协议工作于客户端-服务器架构为上,浏览器作为HTTP客户端通过URL向HTTP服务端即web服务器发送所有请求,web服务器根据接收到的请求后,向客户端送响应信息。

    http协议特性

    (1)基于tcp、ip

    HTTP协议是基于TCP/IP协议只上的应用层协议

    (2)基于请求,响应模式

    http协议规定,请求从客户端发出,最后服务器端响应请求并返回,换句话说,肯定是先从客户端开始建立通信的,服务器端没有接收到请求之前不会发送响应。

    (3)无状态保存

    HTTP是一种不保存状态,即无状态(stateless)协议。http协议自身不对请求和响应之间的通信状态进行保存,也就是说在HTTP这级别,协议对于发送过的请求或响应都不做持久化处理。

    使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生,协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快的处理大量事物,确保协议的可伸缩性,而特意把bttp协议设计成如此简单的,可是随着web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,及时他跳转到该站的其他页面后,也需要能继续保持登录状态,针对这个实力,网站为了能够掌握是谁推送出的请求,需要保存用户的状态,HTTP/1.1虽然是无状态协议,但是为了实现期望的保持状态功能,于是引入了cookie技术。有了cookie再用HTTP协议通信就可以管理状态了。

    无连接

    无连接的含义是限制每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户端的应答后,即断开连接。采用这种方式可以节省传输时间。

    HTTP请求协议与相应协议

    HTTP协议包含由浏览器发送数据到服务器需要遵循的请求协议。用于HTTP协议交互的信被为HTTP报文,请求端(客户端)的HTTP报文做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身是由多行数据构成的字文本。

    请求协议

    请求格式:

    请求方式:get与post请求

    get提交数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如E地Book?name=123. post方法是把提交的数据放在HTTP包的请求体重

    get提交的数据大小有限(因为浏览器对URL的长度有限制),而post方法提交的数据没有限制

    get与post请求在服务端获取请求数据方式不同

    响应协议

    响应格式

    响应状态码

    状态码的值是当前客户端向服务器发送请求是,返回的请求结果。借助状态码,用户可以知道服务器端是正常受理的请求,还是出现了错误,状态码200 OK,以3位数字和原因 成。数字中的一位制定了响应类别,后两位五分响应分别有五种;

     演示示例:

    import socket
    
    
    sock=socket.socket()
    sock.bind(("127.0.0.1",8808))
    sock.listen(5)
    
    while 1:
        print("server waiting.....")
        conn,addr=sock.accept()
        data=conn.recv(1024)
        print("data",data)
    
        # 读取html文件
        with open("login.html","rb") as f:
            data=f.read()
    
        conn.send((b"HTTP/1.1 200 OK
    
    %s"%data))
        conn.close()

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    
    
    <form action="" method="post">
        用户名 <input type="text" name="user">
        密码 <input type="password" name="pwd">
        <input type="submit">
    </form>
    
    </body>
    </html>

     三、web框架

    web框架(web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能。开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的,也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法。

    wsgiref模块

    最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

    如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

    正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。

    from wsgiref.simple_server import make_server
    
    
    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return [b'<h1>Hello, web!</h1>']
    
    
    httpd = make_server('', 8080, application)
    
    print('Serving HTTP on port 8000...')
    # 开始监听HTTP请求:
    httpd.serve_forever()

    DIY一个web框架

     models.py

    import pymysql
    #连接数据库
    conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='',db='web') #db:库名
    #创建游标
    cur = conn.cursor()
    
    sql='''
    create table userinfo(
            id INT PRIMARY KEY ,
            name VARCHAR(32) ,
            password VARCHAR(32)
    )
    
    '''
    
    cur.execute(sql)
    
    #提交
    conn.commit()
    #关闭指针对象
    cur.close()
    #关闭连接对象
    conn.close()

    启动文件manage.py

    from wsgiref.simple_server import make_server
    
    from app01.views import *
    import urls
    
    
    def routers():
    
        URLpattern=urls.URLpattern
        return URLpattern
    
    
    def applications(environ,start_response):
    
        path=environ.get("PATH_INFO")
        start_response('200 OK', [('Content-Type', 'text/html'),('Charset', 'utf8')])
        urlpattern=routers()
        func=None
        for item in urlpattern:
            if path==item[0]:
                func=item[1]
                break
        if func:
            return [func(environ)]
        else:
            return [b"<h1>404!<h1>"]
    
    if __name__ == '__main__':
    
        server=make_server("",8889,applications)
        print("server is working...")
        server.serve_forever()

    urls.py

    from app01.views import *
    
    
    URLpattern = (
        ("/login/", login),
    )

    views

    import pymysql
    
    from urllib.parse import parse_qs
    
    
    def login(request):
    
        if request.get("REQUEST_METHOD")=="POST":
    
            try:
                request_body_size = int(request.get('CONTENT_LENGTH', 0))
            except (ValueError):
                request_body_size = 0
    
            request_body = request['wsgi.input'].read(request_body_size)
            data = parse_qs(request_body)
    
    
            user=data.get(b"user")[0].decode("utf8")
            pwd=data.get(b"pwd")[0].decode("utf8")
    
            #连接数据库
            conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='',db='web') # db:库名
            #创建游标
            cur = conn.cursor()
            SQL="select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'"%(user,pwd)
            cur.execute(SQL)
    
            if cur.fetchone():
    
                f=open("templates/backend.html","rb")
                data=f.read()
                data=data.decode("utf8")
                return data.encode("utf8")
    
            else:
                 print("OK456")
                 return b"user or pwd is wrong"
    
        else:
            f = open("templates/login.html", "rb")
            data = f.read()
            f.close()
            return data

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <h4>登录页面</h4>
    <form action="" method="post">
         用户名 <input type="text" name="user">
         密码 <input type="text" name="pwd">
        <input type="submit">
    </form>
    
    </body>
    </html>

    backend.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h4>welcome to oldboy!</h4>
    </body>
    </html>

     yuan这个package就是一个web框架,下载这个web框架就可以快速实现一些简单的web功能,比如查看时间。

  • 相关阅读:
    git如何忽略特殊文件
    一文了解H5照片上传过程
    Vue组件通信方式(8种)
    H5 拍照图片旋转、压缩和上传
    Chrome插件推荐
    高效开发之使用Cmder替换cmd
    使用git配置ssh的文章推荐
    360极速浏览器如何默认设置必应搜索引擎
    notepad 多文档切换
    centos下kill、killall、pkill命令区别
  • 原文地址:https://www.cnblogs.com/baijinshuo/p/9845789.html
Copyright © 2011-2022 走看看