• django


    ---恢复内容开始---

    首先了解web应用

    一.

    web应用是通过web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要一个浏览器,应用程序分为两种 C/S B/S  ,c/s是客户端/服务器程序,这类程序一般独立运行, b/s 是浏览器/服务器端应用程序,,浏览器是一个socket客户端,服务器是一个socket服务端

    web应用小程序

     1 import socket
     2 
     3 def handle_request(client):
     4     #5.接收浏览器的信息,1024字节接收 
     5     request_data = client.recv(1024)
     6     print("request_data: ",request_data)
     7     # 5.发送响应协议
     8     client.send("HTTP/1.1 200 OK
    status: 200
    Content-Type:text/html
    
    ".encode("utf8"))
     9     # 6.发送数据至浏览器(客户端)
    10     client.send("<h1>Hello, luffycity!</h1><img src=''>".encode("utf8"))
    11 
    12 def main():
    13     # 1.创建socket对象 socket.socket()
    14     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    15     # 2.绑定ip端口
    16     sock.bind(('localhost',8812))
    17     # 3.限制次数
    18     sock.listen(5)
    19 
    20     while True:
    21         print("the server is waiting for client-connection....")
    22         # 4.connection 相当于连接的那把伞,地址
    23         connection, address = sock.accept()
    24         handle_request(connection)
    25         connection.close()
    26 
    27 if __name__ == '__main__':
    28 
    29     main()
    web

    关于响应协议:

               请求协议
    浏览器-------------------> 服务器
    <-------------------
    响应协议

    由服务端发送给浏览器的一种特殊协议,双方规定好的,
    格式:
    响应首行
    HTTP/1.1 200 OK
    协议/版本号/状态码/状态码译文
    响应头
    status: 200
    Content-Type:text/html
    键值对 用 区分开
    响应体
    
    <h1>Hello, luffycity!</h1>
    主要内容 有 区分

    了解http协议
    二.
    http是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。
    HTTP 协议特性
    1.基于TCP/IP:
    http协议是基于TCP/IP协议之上的应用层协议。
    2.基于请求-响应模式:
    HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应
    3.无状态保存
    比如打开一个网页的时候,协议会稍微停留几秒钟,方便快速进行下次访问
    4.无连接
    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    请求协议
    get与post请求方法不同
    • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
    • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
    • GET与POST请求在服务端获取请求数据方式不同。

    响应协议:

    
    

    关于web框架

     三

    wsgiref模块

    最简单的web应用是把html用文件保存好,用一个现成的http服务器软件,接受用户的请求,从文件读取html,返回,要生成动态的html文件,需要把上述步骤自己实现,太麻烦了,需要自己去写,TCP连接(socket模块),解析http请求(接收来自http的协议),发送htto响应(发送响应协议),浏览器和服务器是通过http协议进行通信的,需要一个接口协议实现服务器软件,这个接口就是wsgi,而wsgiref就是python基于wsgi协议开发的服务模块

     1 from wsgiref.simple_server import make_server
     2 
     3 def application(environ, start_response):
     4     """
     5 
     6     :param environ: 请求信息字典
     7     :param start_response: 封装响应格式的
     8     :return:
     9     """
    10     print("environ",environ)
    11     print("PATH_INFO",environ.get("PATH_INFO"))
    12     start_response('200 OK', [('Content-Type', 'text/html'),("k1","v1")])
    13     return [b'<h1>Hello, web!</h1>']
    14 
    15 
    16 httpd = make_server('', 8080, application)
    17 
    18 print('Serving HTTP on port 8080...')
    19 # 开始监听HTTP请求:
    20 httpd.serve_forever()
    wsgiref模块

    environ: 将http协议的各种请求以字典的的形式返回,直接取字典的键值对,

    关于web框架的小小小项目

     web项目中,templates是用来存放html文件的文件夹

    manage.py是用来通过wsgief模块,进行动态的http协议交互

     1 # 引入wsgi模块
     2 from wsgiref.simple_server import make_server
     3 
     4 from urls import urlpattens
     5 
     6 def application(environ, start_response):
     7 
     8     print("environ",environ)
     9     print("PATH_INFO",environ.get("PATH_INFO"))
    10     path=environ.get("PATH_INFO")
    11     data=b""
    12 
    13 
    14     # 方案1
    15     # if path=="/login":
    16     #     data=login(environ)
    17     # elif path=="/auth":
    18     #     data=auth(environ)
    19 
    20     # 方案2
    21     func=None
    22     # 2.1遍历取到的路径 如("/timer", timer),如果path=/time func为timer
    23     for item in urlpattens:
    24         print("------>",item[0])
    25         if item[0]==path:
    26             func=item[1]
    27             break
    28     # 2.2 如果func为空,data= 404 如果不为空,执行timer(environ)函数
    29     if not func:
    30         data=b"<h1>404</h1>"
    31     else:
    32         data = func(environ)
    33 
    34     start_response('200 OK', [('Content-Type', 'text/html')])
    35     # 3.给浏览器返回
    36     return [data]
    37 
    38 
    39 httpd = make_server('', 8088, application)
    40 
    41 print('Serving HTTP on port 8088...')
    42 # 开始监听HTTP请求:
    43 httpd.serve_forever()
    manage文件

    models.py 是用来与数据库打交道的

     1 # 创建表结构
     2 
     3 import pymysql
     4 #连接数据库
     5 conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='',db='web') #db:库名
     6 #创建游标
     7 cur = conn.cursor()
     8 
     9 sql='''
    10 create table userinfo(
    11         id INT PRIMARY KEY ,
    12         name VARCHAR(32) ,
    13         password VARCHAR(32)
    14 )
    15 
    16 '''
    17 
    18 cur.execute(sql)
    19 
    20 #提交
    21 conn.commit()
    22 #关闭指针对象
    23 cur.close()
    24 #关闭连接对象
    25 conn.close()
    model文件

    urls.py 是用来进行对views.py导入的,用来存放访问的请求转到manage,在找到相应的关系执行函数

     1 # url与视图函数的映射关系
     2 from views import login,auth,fav,index,timer
     3 
     4 urlpattens = [
     5     ("/timer", timer),
     6     ("/login", login),
     7     ("/auth", auth),
     8     ("/favicon.ico", fav),
     9     ("/", index),
    10 ]
    urls文件

    views.py 是用来进行对浏览器端返回的信息进行函数的方法结果返回给manage,最后返回到浏览器

     1 from urllib.parse import parse_qs
     2 
     3 def login(environ):
     4     with open("templates/login.html", "rb") as f:
     5         data = f.read()
     6 
     7     return data
     8 
     9 def auth(environ):
    10     # 登录认证
    11 
    12     # 1 获取用户输入的用户名和密码
    13     # 1.1获取接受的字节数
    14     request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    15     print("request_body_size", request_body_size)  # 17
    16     # 1.2 按照字节数获取
    17     request_body = environ['wsgi.input'].read(request_body_size)  # b'user=alex&pwd=123'
    18     # 1.3 将账号密码装换成字典的形式
    19     reqeust_data = parse_qs(request_body)  # {b'user': [b'alex'], b'pwd': [b'123']}
    20     # 1.4  用get取出字典,转换成字符串
    21     user = (reqeust_data.get(b"user")[0]).decode("utf8")
    22     pwd = (reqeust_data.get(b"pwd")[0]).decode("utf8")
    23     print("====>", user, pwd)
    24 
    25     # 2 去数据库做校验,查看提交用户是否合法
    26     # 连接数据库
    27     import pymysql
    28     conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='web')  # db:库名
    29     # 创建游标
    30     cur = conn.cursor()
    31     SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'" % (user, pwd)
    32     cur.execute(SQL)
    33     # print("cur.fetchone:",cur.fetchone()) # (1, 'alex', '123')
    34     if cur.fetchone():
    35         # 验证成功
    36         data = "登录成功!".encode("gbk")
    37     else:
    38         # 验证失败
    39         data = "登录失败!".encode("gbk")
    40 
    41     return data
    42 
    43 
    44 def fav(environ):
    45 
    46     with open("templates/favicon.ico","rb") as f:
    47         data=f.read()
    48 
    49     return data
    50 
    51 
    52 def index(environ):
    53 
    54     with open("templates/index.html", "rb") as f:
    55         data = f.read()
    56 
    57     return data
    58 
    59 def timer(environ):
    60 
    61     import datetime
    62     now=datetime.datetime.now()
    63 
    64     return str(now).encode("utf8")
    views文件

























    ---恢复内容结束---

  • 相关阅读:
    Solr6.6环境安装及core的创建(win7环境)
    使用Druid作为数据源
    Windows远程数据同步工具cwRsync
    解读zookeeper的配置项
    堵塞与非堵塞原理
    Apache Hadoop2.0之HDFS均衡操作分析
    转到简书去了
    淘宝技术这十年概要
    Facebook广告API系列 Business Manager
    Facebook广告API系列 3 Ads Management
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/9825599.html
Copyright © 2020-2023  润新知