pip是Python官方推荐的包管理工具   属于python的一部分
 
 
       pip的使用 
 
pip的安装
            sudo apt-get install python-pip
            sudo apt-get install python3-pip
 
安装包
            pip3  install   package
 
升级
            pip3  install  --upgrade  package
 
查看python包清单
            pip3 list
 
卸载
            pip3 uninstall  package
 
查找软件包
            pip3 search  package
 
显示软件包信息
            pip3 show  package
 
生成软件环境文件
            pip3  freeze  >  requirements.txt
 
根据环境文件安装第三方包
            pip3  install  -r  requirements.txt
 
 
from gevent import  monkey
           monkey.patch_all()
           功能 : 在socket导入之前使用后,用来修改套接字的阻塞行为
 
基于协程并发服务器模型:

  1. import gevent
  2. # 在socket导入之前使用
  3. from gevent import monkey
  4. monkey.patch_all()
  5. from socket import *
  6. from time import ctime
  7. def server(port):
  8. s = socket()
  9. s.bind(('0.0.0.0',port))
  10. s.listen(5)
  11. while True:
  12. c,addr = s.accept()
  13. print("Connect from",addr)
  14. gevent.spawn(handler,c)
  15. #处理客户端请求
  16. def handler(c):
  17. while True:
  18. data = c.recv(1024).decode()
  19. if not data:
  20. break
  21. print("Receive:",data)
  22. c.send(ctime().encode())
  23. c.close()
  24. if __name__ == "__main__":
  25. server(8888)
 
 
            HTTPServer
 
前端  前台  客户端  用户端
      功能 :
            1. 和用户进行交互,获取用户请求
            2. 和后端进行通信,整理用户请求给后端
            3. 接受后端数据内容,展现给用户
 
      要求:
            1. 良好的用户体验
            2. 较全面的交互能力
            3. 必要的前端优化
            4. 良好的跨平台型
 
后端  后台   服务端
      功能:
            1. 接受前端请求
            2. 进行逻辑处理和运算
            3. 和磁盘交互 (文件处理,数据库处理)
            4. 进行数据整理,更好的向前端返回结果
 
      要求:
            1. 更好的并发性
            2. 更快速的处理速度
            3. 更好的健壮性
            4. 可维护和可扩展
            5. 数据的安全
 
HTTPServer + Frame 版本
 
    httpserver 功能 : 
            1. 接受HTTP请求 (socket通信)
            2. 解析http请求 
               *  请求类型  GET,POST
               *  请求内容  
            3. 将具体的请求整理后给 web Frame
            4. 接受后端应用返回的数据内容
            5. 将数据组织为HTTP response的格式发给客户端
 
 
 
    什么是框架?
               矿建即开发模板,通过根据框架规则填写内容即可完成快速开发工作
   Frame 功能:
            1. 接收httpserver发送的request请求
            2. 进行逻辑处理或者数据整合
            3. 将结果发送给httpserver
                * 如果能够处理则返回结果和数据
                * 不能处理返回原因
 
      结构 :
 
HTTPServer --- static目录 
           --- HttpServer.py
   --- WebFrame.py
           --- setting.py
   --- views.py
 
 
m = __import__(module)
            功能 : 导入一个模块
            参数:要导入的模块
            返回值:模块对象
 
getattr(obj,attr)
            功能:获取一个对象的属性
            参数: obj   对象
                       attr  属性
            返回值: 返回属性值
 
__call__() 魔法方法
            作用 : 让实例对象可以像函数一样被调用执行
 
  1. class CallTest(object):
  2. def __call__(self,a,b):
  3. print("This is call test")
  4. print("a =",a,"b =",b)
  5. test = CallTest()
  6. test(1,2)
 
 
HTTPServer完整代码:
 
Server:

  1. #coding=utf-8
  2.  
  3. '''
  4. module: HTTPServer.py
  5. name : Paris
  6. time : 2018-8-28
  7. 功能 :httpserver部分
  8. modules:
  9. Python3.5 、socket、sys
  10. threading、re、setting
  11. '''
  12. from socket import *
  13. import sys
  14. from threading import Thread
  15. import re
  16. from setting import *
  17.  
  18. #处理http请求类
  19. class HTTPServer(object):
  20. def __init__(self,application):
  21. self.sockfd = socket()
  22. self.sockfd.setsockopt\
  23. (SOL_SOCKET,SO_REUSEADDR,1)
  24. #获取模块接口
  25. self.application = application
  26.  
  27. def bind(self,host,port):
  28. self.host = host
  29. self.port = port
  30. self.sockfd.bind((self.host,self.port))
  31. #启动服务器
  32. def serve_forever(self):
  33. self.sockfd.listen(10)
  34. print("Listen the port %d..."%self.port)
  35. while True:
  36. connfd,addr = self.sockfd.accept()
  37. print("Connect from",addr)
  38. handle_client = Thread\
  39. (target = self.client_handler,\
  40. args = (connfd,))
  41. handle_client.setDaemon(True)
  42. handle_client.start()
  43.  
  44. def client_handler(self,connfd):
  45. #接收浏览器request
  46. request = connfd.recv(4096)
  47. #可以分析请求头和请求体
  48. request_lines = request.splitlines()
  49. #获取请求行
  50. request_line = request_lines[0].decode('utf-8')
  51.  
  52. #获取请求方法和请求内容
  53. pattern = r'(?P<METHOD>[A-Z]+)\s+(?P<PATH_INFO>/\S*)'
  54. try:
  55. env = re.match(pattern,request_line).groupdict()
  56. except:
  57. response_headlers = "HTTP/1.1 500 SERVER ERROR\r\n"
  58. response_headlers += "\r\n"
  59. response_body = "server error"
  60. response = response_headlers + response_body
  61. connfd.send(response.encode())
  62.  
  63. # method,filename = \
  64. # re.findall(r'^([A-Z]+)\s+(/\S*)', request_line)[0]
  65.  
  66. #将解析内容合成字典给web frame使用
  67. # env = {'METHOD':method,'PATH_INFO':filename}
  68. # print(env)
  69.  
  70. #将env给Frame处理,得到返回内容
  71. response = self.application(env)
  72.  
  73. #发送给客户端
  74. if response:
  75. connfd.send(response.encode())
  76. connfd.close()
  77.  
  78. if __name__ == "__main__":
  79. #将要使用的模块导入进来
  80. sys.path.insert(1,MODULE_PATH)
  81. m = __import__(MODULE)
  82. application = getattr(m,APP)
  83.  
  84. httpd = HTTPServer(application)
  85. httpd.bind(HOST,PORT)
  86. httpd.serve_forever()

setting:

  1. # setting.py
  2.  
  3. #httpserver配置文件
  4. HOST = '0.0.0.0'
  5. PORT = 8000
  6.  
  7. #设置要使用的模块和应用
  8. MODULE_PATH = "." #设置Frame模块路径
  9. MODULE = 'WebFrame' #设置模块名称
  10. APP = 'app' #使用的应用
WebFrame:

  1. #coding=utf-8
  2. from views import *
  3. '''
  4. WebFrame.py
  5. WebFrame 框架
  6. 用于处理server解析请求
  7. '''
  8.  
  9. #设置静态文件夹路径
  10. STATIC_DIR = "./static"
  11.  
  12. #应用
  13. class Application(object):
  14. def __init__(self,urls):
  15. self.urls = urls
  16.  
  17. def __call__(self,env):
  18. method = env.get("METHOD",'GET')
  19. path = env.get("PATH_INFO",'/') #请求内容
  20.  
  21. if method == 'GET':
  22. if path == '/' or path[-5:] == '.html':
  23. response = self.get_html(path)
  24. else:
  25. response = self.get_data(path)
  26. elif method == 'POST':
  27. pass
  28.  
  29. return response
  30.  
  31. def get_html(self,path):
  32. if path == '/':
  33. get_file = STATIC_DIR + "/index.html"
  34. else:
  35. get_file = STATIC_DIR + path
  36. try:
  37. fd = open(get_file)
  38. except IOError :
  39. #没有找到请求网页
  40. responseHeaders = "HTTP/1.1 404 not found\r\n"
  41. responseHeaders += '\r\n'
  42. response_body = "Sorry,the page not found"
  43. else:
  44. responseHeaders = "HTTP/1.1 200 OK\r\n"
  45. responseHeaders += '\r\n'
  46. response_body = fd.read()
  47. finally:
  48. response = responseHeaders + response_body
  49. return response
  50.  
  51. def get_data(self,path):
  52. for url,handler in self.urls:
  53. if path == url:
  54. response_headers = "HTTP/1.1 200 OK\r\n"
  55. response_headers += '\r\n'
  56. response_body = handler()
  57. return response_headers + response_body
  58.  
  59. response_headers = "HTTP/1.1 404 not found\r\n"
  60. response_headers += '\r\n'
  61. response_body = "Sorry ,not found the data"
  62. return response_headers + response_body
  63.  
  64. urls = [
  65. ('/time',show_time),
  66. ('/hello',say_hello),
  67. ('/bye',say_bye),
  68. ]
  69.  
  70. app = Application(urls)
views:
 

  1. # views.py
  2. # 具体处理模块
  1. import time
  2.  
  3. def show_time():
  4. return time.ctime()
  5.  
  6. def say_hello():
  7. return "hello world"
  8.  
  9. def say_bye():
  10. return "Good Bye"
 
python 的 httpserver模块
            python2 BaseHTTPServer
            python3 http.server
示例:

  1. try:
  2. from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
  3. except ImportError:
  4. from http.server import BaseHTTPRequestHandler,HTTPServer
  5.  
  6. class RequestHandler(BaseHTTPRequestHandler):
  7. def do_GET(self):
  8. print(self.headers) #请求头
  9. print(self.path) #请求内容
  10. fd = open('test.html','rb')
  11. content = fd.read()
  12. #组织response
  13. self.send_response(200)
  14. self.send_header('Content-Type','text/html')
  15. self.end_headers()
  16. self.wfile.write(content)
  17.  
  18. def do_POST(self):
  19. pass
  20.  
  21. address = ('0.0.0.0',8080)
  22. #生成httpserver对象
  23. httpd = HTTPServer(address,RequestHandler)
  24. httpd.serve_forever() #启动服务器

Python全栈 项目(HTTPServer、PiP使用)的更多相关文章

  1. Python全栈 项目(电子词典、协程、pdb调试)

    后面我就不截图了 大家还是看原文吧                          https://yq.aliyun.com/articles/629534 . ................. ...

  2. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  3. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  4. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  5. 战争热诚的python全栈开发之路

    从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...

  6. Win10构建Python全栈开发环境With WSL

    目录 Win10构建Python全栈开发环境With WSL 启动WSL 总结 对<Dev on Windows with WSL>的补充 Win10构建Python全栈开发环境With ...

  7. python 全栈开发,Day117(popup,Model类的继承,crm业务开发)

    昨日内容回顾 第一部分:权限相关 1. 权限基本流程 用户登录成功后获取权限信息,将[权限和菜单]信息写入到session. 以后用户在来访问,在中间件中进行权限校验. 为了提升用户体验友好度,在后台 ...

  8. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  9. python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

随机推荐

  1. mavan下scala编译中文乱码的问题.以及内存溢出问题解决

    网上都没有找到我这个问题.都是自己解决的.也不知道后来者能不能遇到 关键字: java.lang.StackOverflowError scala not found scala <config ...

  2. Java中集合随笔

    先上一张图:关于collection接口的 一.Collection中的常用功能: boolean add(Object e): 向集合中添加元素void clear():清空集合中所有元素boole ...

  3. oracle在线迁移同步数据,数据库报错

    报需要升级的错误,具体处理步骤如下: 一.错误信息 SQL> alter database open ;alter database open resetlogs*ERROR at line 1 ...

  4. shell习题第1题:每日一文件

    [题目要求] 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件 例如生成的文件为2019-04-25.log,并且把磁盘使用情况写入到这个文件中 不用考虑cron,仅仅写脚本即可 [核心要 ...

  5. Redis学习笔记(一)

    定义 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库. 从该定义中抽出几个关键信息,以表示Redis的特性: 存储结构:key-val ...

  6. Python学习 :集合

    集合 Set 集合的创建 集合的创建只有一种方式 集合中的元素必须是不可变的数据类型 集合是无序的,可以通过 for 循环来遍历或者迭代器进行筛选 s=set('xiaoming') s1=['ale ...

  7. 对Python语法简洁的贴切描述

    很多人认为,Python与其他语言相比,具有语法简洁的特点.但这种简洁到底体现在哪些地方,很少有人能说清楚.今天看到一个对这一问题的描述,个人觉得很不错,原文如下: “Python语法主要用来精确表达 ...

  8. python之变量的命名规则

    变量的命名规则: 1.变量名由数字.字母和下划线组成名 2.变量名不能以数字开头 3.禁止使用python中的关键字 4.不能使用中文和拼音 5.变量名要区分大小写 6.变量名要有意义 7.推荐写法: ...

  9. HyperLedger Fabric 1.4 kafka生产环境部署(11.1)

    11.1 Kafka模式简介       上一章介绍的Solo模式只存在一个排序(orderer)服务,是一种中心化结构,一旦排序(orderer)服务出现了问题,整个区块链网络将会崩溃,为了能在正式 ...

  10. Java设计模式(13)——结构型模式之桥梁模式(Bridge)

    一.概述 概念 将抽象与实现脱耦,使得抽象和实现可以独立运行 UML图 角色: 角色关系 二.实践 按照上面的角色建立相应的类 抽象化角色 /** * 抽象化角色 * * @author Admini ...