socket 处理http请求

  1. # 你可以将web框架理解成服务端
  2. import socket
  3. server = socket.socket() # TCP 三次握手四次挥手 osi七层
  4. server.bind(('127.0.0.1',8080)) # IP协议 以太网协议 arp协议...
  5. server.listen(5) # 池 ...
  6. """
  7. b'GET / HTTP/1.1\r\n
  8. Host: 127.0.0.1:8082\r\n
  9. Connection: keep-alive\r\n
  10. Upgrade-Insecure-Requests: 1\r\n
  11. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36\r\n
  12. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
  13. Sec-Fetch-Site: none\r\n
  14. Sec-Fetch-Mode: navigate\r\n
  15. Sec-Fetch-User: ?1\r\n
  16. Sec-Fetch-Dest: document\r\n
  17. Accept-Encoding: gzip, deflate, br\r\n
  18. Accept-Language: zh-CN,zh;q=0.9\r\n
  19. Cookie: csrftoken=KYJnVBLPpJxwt09TOmTXzpb5qkFJwHVxVGpi0NxEGIg4z5VUuazZ1O2RMwSisu14\r\n
  20. \r\n'
  21. """
  22. while True:
  23. conn, addr = server.accept()
  24. data = conn.recv(1024)
  25. # print(data) # 二进制数据
  26. data = data.decode('utf-8') # 字符串
  27. # 获取字符串中特定的内容 正则 如果字符串有规律也可以考虑用切割
  28. conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
  29. current_path = data.split(' ')[1]
  30. # print(current_path)
  31. if current_path == '/index':
  32. # conn.send(b'index heiheihei')
  33. with open(r'templates/01 myhtml.html', 'rb') as f:
  34. conn.send(f.read())
  35. elif current_path == '/login':
  36. conn.send(b'login')
  37. else:
  38. # 你直接忽略favicon.ico
  39. conn.send(b'hello web')
  40. conn.close()

基于wigiref模块

框架

  1. from wsgiref.simple_server import make_server
  2. from urls import urls
  3. from views import *
  4. def run(env, response):
  5. """
  6. :param env:请求相关的所有数据
  7. :param response:响应相关的所有数据
  8. :return: 返回给浏览器的数据
  9. """
  10. # print(env) # 大字典 wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作
  11. # 从env中取
  12. response('200 OK', []) # 响应首行 响应头
  13. current_path = env.get('PATH_INFO')
  14. # if current_path == '/index':
  15. # return [b'index']
  16. # elif current_path == '/login':
  17. # return [b'login']
  18. # return [b'404 error']
  19. # 定义一个变量 存储匹配到的函数名
  20. func = None
  21. for url in urls: # url (),()
  22. if current_path == url[0]:
  23. # 将url对应的函数名赋值给func
  24. func = url[1]
  25. break # 匹配到一个之后 应该立刻结束for循环
  26. # 判断func是否有值
  27. if func:
  28. res = func(env)
  29. else:
  30. res = error(env)
  31. return [res.encode('utf-8')]
  32. if __name__ == '__main__':
  33. server = make_server('127.0.0.1',8080,run)
  34. """
  35. 会实时监听127.0.0.1:8080地址 只要有客户端来了
  36. 都会交给run函数处理(加括号触发run函数的运行)
  37. flask启动源码
  38. make_server('127.0.0.1',8080,obj)
  39. __call__
  40. """
  41. server.serve_forever() # 启动服务端

view

  1. def index(env):
  2. return 'index'
  3. def login(env):
  4. return "login"
  5. def error(env):
  6. return '404 error'
  7. def xxx(env):
  8. with open(r'templates/02 myxxx.html','r',encoding='utf-8') as f:
  9. return f.read()
  10. import datetime
  11. def get_time(env):
  12. current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
  13. # 如何将后端获取到的数据"传递"给html文件?
  14. with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
  15. data = f.read()
  16. # data就是一堆字符串
  17. data = data.replace('dwadasdsadsadasdas',current_time) # 在后端将html页面处理好之后再返回给前端
  18. return data
  19. from jinja2 import Template
  20. def get_dict(env):
  21. user_dic = {'username':'jason','age':18,'hobby':'read'}
  22. with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f:
  23. data = f.read()
  24. tmp = Template(data)
  25. res = tmp.render(user=user_dic)
  26. # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
  27. return res
  28. import pymysql
  29. def get_user(env):
  30. # 去数据库中获取数据 传递给html页面 借助于模版语法 发送给浏览器
  31. conn = pymysql.connect(
  32. host = '127.0.0.1',
  33. port = 3306,
  34. user = 'root',
  35. password = 'admin123',
  36. db='day59',
  37. charset = 'utf8',
  38. autocommit = True
  39. )
  40. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  41. sql = 'select * from userinfo'
  42. affect_rows = cursor.execute(sql)
  43. data_list = cursor.fetchall() # [{},{},{}]
  44. # 将获取到的数据传递给html文件
  45. with open(r'templates/05 get_data.html','r',encoding='utf-8') as f:
  46. data = f.read()
  47. tmp = Template(data)
  48. res = tmp.render(user_list=data_list)
  49. # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
  50. return res
  51. if __name__ == '__main__':
  52. get_user(111)

url

  1. from views import *
  2. # url与函数的对应关系
  3. urls = [
  4. ('/index',index),
  5. ('/login',login),
  6. ('/xxx',xxx),
  7. ('/get_time',get_time),
  8. ('/get_dict',get_dict),
  9. ('/get_user',get_user)
  10. ]