Web应用和Web框架

百般思念 提交于 2020-03-24 21:47:14

     一、Web应用本质

     任何Web应用实际上都是一个Socket服务端,浏览器就是Web应用的客户端。一个最简单的Web应用就是写好一个HTML的文档,然后用现成的HTTP服务器软件如Nginx、Apache、Tomcat等区接收用户请求,再把HTML文档中的内容

通过万维网传送给客户端。但是这样只能给客户端发送同一个HTML文档的内容,如果要动态生成HTML就需要我们自己去做接收HTTP请求、解析HTTP请求、从HTTP请求中获取到需要的信息后生成一个新的HTML、发送一个HTTP响应将动态生成的HTML传送给客户端。由于HTTP协议是一个很深奥的协议,它有很多内容,如果以上这些事情都有我们自己来完成就需要研究HTTP协议,这样就太影响开发效率了,为了解决这个问题就有了CGI通用网关接口,它帮助我们完成对HTTP协议的接收、解析以及最后的响应,让我们可以专心写Web业务代码,针对Python实现的CGI之一就是WSGI。

 

    二、wsgiref模块

    wsgiref模块的simple_server中的make_server类可以让我简单实现一个Web服务器,该类实例化需要三个参数,服务器IP、服务器端口、请求处理函数,其中请求处理函数有两个参数一个environ包含一个请求的所有信息以键值对形式存放,start_response定义响应头信息,函数中需要返回一个响应正文中的数据,然后实例化之后就可以用实例化的对象调用serve_forever()方法启动服务端

    

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()

 

    三、Web框架

    Web框架实际上就是将我们在写Web应用中需要反复做的或者很复杂的事情进行模块化封装,让我们只需要按照框架要求的格式写Web应用就可以极大的减少开发工作量,比如我们可以利用wsgiref模块实现一个简单的Web框架app01

     负责启动整个项目的manage.py

     

from wsgiref.simple_server import make_server

#  request            response


from app01.views import *

from app01 import urls


def routers():

    URLpattern=urls.URLpattern

    return URLpattern


def applications(environ,start_response):

    path=environ.get("PATH_INFO")
    print("path",path)
    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>"]


    # return [b"<h1>hello world<h1>"]


if __name__ == '__main__':

    t=make_server("",8810,applications)
    print("server is working...")
    t.serve_forever()

   负责路径和业务函数映射的urls

   

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":
        print("+++++",request)


        #当请求方式是GET时
        # user_union,pwd_union=request.get("QUERY_STRING").split("&")
        # _,user=user_union.split("=")
        # _,pwd=pwd_union.split("=")

        # 环境变量 CONTENT_LENGTH 可能是空值 或者 值丢失
        try:
            request_body_size = int(request.get('CONTENT_LENGTH', 0))
        except (ValueError):
            request_body_size = 0
        # 当请求方式是POST时, 变量将会被放在存在域wsgi.input文件中的HTTP请求信息中, 由WSGI 服务器一起发送.
        request_body = request['wsgi.input'].read(request_body_size)
        d = parse_qs(request_body)


        user=d.get(b"user")[0].decode("utf8")
        pwd=d.get(b"pwd")[0].decode("utf8")

        print("user",user,pwd)


        #连接数据库
        conn = pymysql.connect(host='',port= 3306,user = 'root',passwd='',db='s6') #db:库名
        #创建游标
        cur = conn.cursor()

        SQL="select * from userinfo2 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"))%user
            return data.encode("utf8")

        else:
             return b"user or pwd is wrong"


    else:
        f = open("templates/login.html", "rb")

        data = f.read()
        f.close()

        return data

   负责处理数据库的models

   

import pymysql


import pymysql
#连接数据库
conn = pymysql.connect(host='',port= 3306,user = 'root',passwd='',db='s6') #db:库名
#创建游标
cur = conn.cursor()

# sql='''
# create table userinfo2(
#         id INT PRIMARY KEY ,
#         name VARCHAR(32) ,
#         password VARCHAR(32)
# )
#
# '''
#
# cur.execute(sql)
#
# cur.executemany("insert into userinfo2 values(%s,%s,%s)", [(1,"yuan","123"),
#                                                           (2,"alex","456"),
#                                                           (3,"egon","789")])


cur.execute("select * from userinfo2 WHERE NAME='yuan' AND PASSWORD ='123'")
#提交
conn.commit()
#关闭指针对象
cur.close()
#关闭连接对象
conn.close()

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!