欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  一、Web框架本质
 
  所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端
 
  二、Web框架功能
 
  socket收发消息——wsgiref(测试)、uwsgi(线上)
 
  根据不同的路径返回不同的字符串
 
  返回动态页面(字符串的替换)——jinja2
 
  三、Web框架种类
 
  django
 
  根据不同的路径返回不同的字符串
 
  返回动态页面(字符串的替换)
 
  flask
 
  根据不同的路径返回不同的字符串
 
  tornado
 
  socket收发消息
 
  根据不同的路径返回不同的字符串
 
  返回动态页面(字符串的替换)
 
  四、自定义web框架
 
  简单示例:socket服务端
 
  importsocket
 
  #创建一个socket对象
 
  sk=socket.socket()
 
  #绑定IP和端口
 
  sk.bind(('127.0.0.1',8000))
 
  #监听
 
  sk.listen(5)
 
  #等待连接
 
  whileTrue:
 
  conn,addr=sk.accept()
 
  #接收数据
 
  data=conn.recv(1024)
 
  print(data)
 
  #返回数据
 
  conn.send(b'HTTP/1.1200OK\r\n\r\n<h1>ok!</h1>')
 
  #断开连接
 
  conn.close()
 
  根据不同路径返回不同的内容(普通版)
 
  importsocket
 
  #创建一个socket对象
 
  sk=socket.socket()
 
  #绑定IP和端口
 
  sk.bind(('127.0.0.1',8000))
 
  #监听
 
  sk.listen(5)
 
  #等待连接
 
  whileTrue:
 
  conn,addr=sk.accept()
 
  #接收数据
 
  data=conn.recv(1024)
 
  data=data.decode('utf-8')
 
  url=data.split()[1]
 
  conn.send(b'HTTP/1.1200OK\r\n\r\n')
 
  ifurl=='/index/':
 
  #返回数据
 
  conn.send(b'<h1>index!</h1>')
 
  elifurl=='/home/':
 
  conn.send(b'<h1>home!</h1>')
 
  else:
 
  conn.send(b'<h1>404notfound!</h1>')
 
  #断开连接
 
  conn.close()
 
  普通版
 
  importsocket
 
  #创建一个socket对象
 
  sk=socket.socket()
 
  #绑定IP和端口
 
  sk.bind(('127.0.0.1',8000))
 
  #监听
 
  sk.listen(5)
 
  #函数
 
  defindex(url):
 
  ret='<h1>index!</h1>({})'.format(url)
 
  returnret.encode('utf-8')
 
  defhome(url):
 
  ret='<h1>home!</h1>({})'.format(url)
 
  returnret.encode('utf-8')
 
  #等待连接
 
  whileTrue:
 
  conn,addr=sk.accept()
 
  #接收数据
 
  data=conn.recv(1024)
 
  data=data.decode('utf-8')
 
  url=data.split()[1]
 
  conn.send(b'HTTP/1.1200OK\r\n\r\n')
 
  ifurl=='/index/':
 
  #返回数据
 
  ret=index(url)
 
  elifurl=='/home/':
 
  ret=home(url)
 
  else:
 
  ret=b'<h1>404notfound!</h1>'
 
  conn.send(ret)
 
  #断开连接
 
  conn.close()
 
  函数版
 
  importsocket
 
  #创建一个socket对象
 
  sk=socket.socket()
 
  #绑定IP和端口
 
  sk.bind(('127.0.0.1',8000))
 
  #监听
 
  sk.listen(5)
 
  #函数
 
  defindex(url):
 
  ret='<h1>index!</h1>({})'.format(url)
 
  returnret.encode('utf-8')
 
  defhome(url):
 
  ret='<h1>home!</h1>({})'.format(url)
 
  returnret.encode('utf-8')
 
  #定义一个list1和实际要执行的函数的对应关系
 
  list1=[
 
  ('/index/',index),
 
  ('/home/',home),
 
  ]
 
  #等待连接
 
  whileTrue:
 
  conn,addr=sk.accept()
 
  #接收数据
 
  data=conn.recv(1024)
 
  data=data.decode('utf-8')
 
  url=data.split()[1]
 
  conn.send(b'HTTP/1.1200OK\r\n\r\n')
 
  func=None
 
  foriinlist1:
 
  ifurl==i[0]:
 
  func=i[1]
 
  break
 
  iffunc:
 
  ret=func(url)
 
  else:
 
  ret=b'<h1>404notfound!</h1>'
 
  conn.send(ret)
 
  #断开连接
 
  conn.close()
 
  函数进阶版
 
  importsocket
 
  #创建一个socket对象
 
  sk=socket.socket()
 
  #绑定IP和端口
 
  sk.bind(('127.0.0.1',8000))
 
  #监听
 
  sk.listen(5)
 
  #函数
 
  defindex(url):
 
  withopen('index.html','rb')asf:
 
  ret=f.read()
 
  returnret
 
  defhome(url):
 
  ret='<h1>home!</h1>({})'.format(url)
 
  returnret.encode('utf-8')
 
  #定义一个list1和实际要执行的函数的对应关系
 
  list1=[
 
  ('/index/',index),
 
  ('/home/',home),
 
  ]
 
  #等待连接
 
  whileTrue:
 
  conn,addr=sk.accept()
 
  #接收数据
 
  data=conn.recv(1024)
 
  data=data.decode('utf-8')
 
  url=data.split()[1]
 
  conn.send(b'HTTP/1.1200OK\r\n\r\n')
 
  func=None
 
  foriinlist1:
 
  ifurl==i[0]:
 
  func=i[1]
 
  break
 
  iffunc:
 
  ret=func(url)
 
  else:
 
  ret=b'<h1>404notfound!</h1>'
 
  conn.send(ret)
 
  #断开连接
 
  conn.close()
 
  返回html页面
 
  importsocket
 
  importtime
 
  #创建一个socket对象
 
  sk=socket.socket()
 
  #绑定IP和端口
 
  sk.bind(('127.0.0.1',8000))
 
  #监听
 
  sk.listen(5)
 
  #函数
 
  defindex(url):
 
  withopen('index.html','rb')asf:
 
  ret=f.read()
 
  returnret
 
  defhome(url):
 
  ret='<h1>home!</h1>({})'.format(url)
 
  returnret.encode('utf-8')
 
  deftimer(url):
 
  now=time.strftime('%H:%M:%S')
 
  withopen('time.html','r',encoding='utf-8')asf:
 
  data=f.read()
 
  data=data.replace('xxtimexx',now)
 
  ?
 
  returndata.encode('utf-8')
 
  #定义一个list1和实际要执行的函数的对应关系
 
  list1=[
 
  ('/index/',index),
 
  ('/home/',home),
 
  ('/time/',timer),
 
  ]
 
  #等待连接
 
  whileTrue:
 
  conn,addr=sk.accept()
 
  #接收数据
 
  data=conn.recv(1024)
 
  data=data.decode('utf-8')
 
  url=data.split()[1]
 
  conn.send(b'HTTP/1.1200OK\r\n\r\n')
 
  func=None
 
  foriinlist1:
 
  ifurl==i[0]:
 
  func=i[1]
 
  break
 
  iffunc:
 
  ret=func(url)
 
  else:
 
  ret=b'<h1>404notfound!</h1>'
 
  conn.send(ret)
 
  #断开连接
 
  conn.close()
 
  补充:time.html
 
  <!DOCTYPEhtml>
 
  <htmllang="en">
 
  <head>
 
  <metacharset="UTF-8">
 
  <title>Title</title>
 
  </head>
 
  <body>
 
  <h1>当前时间是:@@time@@</h1>
 
  </body>
 
  </html>
 
  返回动态页面
 
  五、wsgiref
 
  常用的WSGI服务器有uWSGI、Gunicorn
 
  Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器
 
  简单示例:
 
  """
 
  根据URL中不同的路径返回不同的内容--函数进阶版
 
  返回HTML页面
 
  让网页动态起来
 
  wsgiref模块版
 
  """
 
  fromwsgiref.simple_serverimportmake_server
 
  #将返回不同的内容部分封装成函数
 
  defindex(url):
 
  #读取index.html页面的内容
 
  withopen("index.html","r",encoding="utf8")asf:
 
  s=f.read()
 
  #返回字节数据
 
  returnbytes(s,encoding="utf8")
 
  defhome(url):
 
  withopen("home.html","r",encoding="utf8")asf:
 
  s=f.read()
 
  returnbytes(s,encoding="utf8")
 
  deftimer(url):
 
  importtime
 
  withopen("time.html","r",encoding="utf8")asf:
 
  s=f.read()
 
  s=s.replace('@@time@@',time.strftime("%Y-%m-%d%H:%M:%S"))
 
  returnbytes(s,encoding="utf8")
 
  #定义一个url和实际要执行的函数的对应关系
 
  list1=[
 
  ("/index/",index),
 
  ("/home/",home),
 
  ("/time/",timer),
 
  ]
 
  defrun_server(environ,start_response):
 
  start_response('200OK',[('Content-Type','text/html;charset=utf8'),])#设置HTTP响应的状态码和头信息
 
  url=environ['PATH_INFO']#取到用户输入的url
 
  func=None
 
  foriinlist1:
 
  ifi[0]==url:
 
  func=i[1]
 
  break
 
  iffunc:
 
  response=func(url)
 
  else:
 
  response=b"404notfound!"
 
  return[response,]
 
  if__name__=='__main__':
 
  httpd=make_server('127.0.0.1',8090,run_server)
 
  print("我在8090等你哦...")
 
  httpd.serve_forever()
 
  示例
 
  六、jinja2
 
  模板渲染现成的工具:jinja2
 
  下载jinja2:pipinstalljinja2
 
  示例:
 
  fromwsgiref.simple_serverimportmake_server
 
  fromjinja2importTemplate
 
  defindex(url):
 
  #读取HTML文件内容
 
  withopen("index2.html","r",encoding="utf8")asf:
 
  data=f.read()
 
  template=Template(data)#生成模板文件
 
  ret=template.render({'name':'alex','hobby_list':['抽烟','喝酒','烫头']})#把数据填充到模板中
 
  returnbytes(ret,encoding="utf8")
 
  defhome(url):
 
  withopen("home.html","r",encoding="utf8")asf:
 
  s=f.read()
 
  returnbytes(s,encoding="utf8")
 
  #定义一个url和实际要执行的函数的对应关系
 
  list1=[
 
  ("/index/",index),
 
  ("/home/",home),
 
  ]
 
  defrun_server(environ,start_response):
 
  start_response('200OK',[('Content-Type','text/html;charset=utf8'),])#设置HTTP响应的状态码和头信息
 
  url=environ['PATH_INFO']#取到用户输入的url
 
  func=None
 
  foriinlist1:
 
  ifi[0]==url:
 
  func=i[1]
 
  break
 
  iffunc:
 
  response=func(url)
 
  else:
 
  response=b"404notfound!"
 
  return[response,]
 
  if__name__=='__main__':
 
  httpd=make_server('127.0.0.1',8090,run_server)
 
  print("我在8090等你哦...")
 
  httpd.serve_forever()
 
  <!DOCTYPEhtml>
 
  <htmllang="zh-CN">
 
  <head>
 
  <metacharset="UTF-8">
 
  <metahttp-equiv="x-ua-compatible"content="IE=edge">
 
  <metaname="viewport"content="width=device-width,initial-scale=1">
 
  <title>Title</title>
 
  </head>
 
  <body>
 
  <h1>姓名:{{name}}</h1>
 
  <h1>爱好:</h1>
 
  <ul>
 
  {%forhobbyinhobby_list%}
 
  <li>{{hobby}}</li>
 
  {%endfor%}
 
  </ul>
 
  </body>
 
  </html>
 
  index2.html
 
  

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h54900.shtml