Python全栈 项目(HTTPServer、PiP使用)

简介: Python全栈、Python项目、练手项目、HTTPServer、HTTP协议、HTTP

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导入之前使用后,用来修改套接字的阻塞行为

基于协程并发服务器模型:
        
import gevent 
# 在socket导入之前使用
from gevent import monkey 
monkey.patch_all()
from socket import * 
from time import ctime 


def server(port):
    s = socket()
    s.bind(('0.0.0.0',port))
    s.listen(5)
    while True:
        c,addr = s.accept()
        print("Connect from",addr)
        gevent.spawn(handler,c)

#处理客户端请求
def handler(c):
    while True:
        data = c.recv(1024).decode()
        if not data:
            break
        print("Receive:",data)
        c.send(ctime().encode())
    c.close()


if __name__ == "__main__":
    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__() 魔法方法
            作用 : 让实例对象可以像函数一样被调用执行

class CallTest(object):
    def __call__(self,a,b):
        print("This is call test")
        print("a =",a,"b =",b)

test = CallTest()
test(1,2)


HTTPServer完整代码:

Server:

#coding=utf-8

'''
module: HTTPServer.py
name : Paris
time : 2018-8-28
功能 :httpserver部分
modules: 
    Python3.5 、socket、sys
    threading、re、setting
'''
from socket import  *
import sys 
from threading import Thread
import re
from setting import * 

#处理http请求类
class HTTPServer(object):
    def __init__(self,application):
        self.sockfd = socket()
        self.sockfd.setsockopt\
        (SOL_SOCKET,SO_REUSEADDR,1)
        #获取模块接口
        self.application = application

    def bind(self,host,port):
        self.host = host
        self.port = port 
        self.sockfd.bind((self.host,self.port))
    #启动服务器
    def serve_forever(self):
        self.sockfd.listen(10)
        print("Listen the port %d..."%self.port)
        while True:
            connfd,addr = self.sockfd.accept()
            print("Connect from",addr)
            handle_client = Thread\
            (target = self.client_handler,\
                args = (connfd,))
            handle_client.setDaemon(True)
            handle_client.start()

    def client_handler(self,connfd):
        #接收浏览器request
        request = connfd.recv(4096)
        #可以分析请求头和请求体
        request_lines = request.splitlines()
        #获取请求行
        request_line = request_lines[0].decode('utf-8')
        
        #获取请求方法和请求内容
        pattern = r'(?P<METHOD>[A-Z]+)\s+(?P<PATH_INFO>/\S*)'
        try:
            env = re.match(pattern,request_line).groupdict()
        except:
            response_headlers =  "HTTP/1.1 500 SERVER ERROR\r\n"
            response_headlers += "\r\n"
            response_body = "server error"
            response = response_headlers + response_body
            connfd.send(response.encode())

        # method,filename = \
        # re.findall(r'^([A-Z]+)\s+(/\S*)', request_line)[0]

        #将解析内容合成字典给web frame使用
        # env = {'METHOD':method,'PATH_INFO':filename}
        # print(env)

        #将env给Frame处理,得到返回内容
        response = self.application(env)

        #发送给客户端
        if response:
            connfd.send(response.encode())
            connfd.close()


if __name__ == "__main__":
    #将要使用的模块导入进来
    sys.path.insert(1,MODULE_PATH)
    m = __import__(MODULE)
    application = getattr(m,APP)

    httpd = HTTPServer(application)
    httpd.bind(HOST,PORT)
    httpd.serve_forever()

setting:

# setting.py

#httpserver配置文件
HOST = '0.0.0.0'
PORT = 8000

#设置要使用的模块和应用
MODULE_PATH = "."  #设置Frame模块路径
MODULE = 'WebFrame'  #设置模块名称
APP = 'app'  #使用的应用


WebFrame:

#coding=utf-8 
from views import *
'''
WebFrame.py
WebFrame 框架
用于处理server解析请求
'''


#设置静态文件夹路径
STATIC_DIR = "./static"

#应用
class Application(object):
    def __init__(self,urls):
        self.urls = urls

    def __call__(self,env):
        method = env.get("METHOD",'GET')
        path = env.get("PATH_INFO",'/') #请求内容

        if method == 'GET':
            if path == '/' or path[-5:] == '.html':
                response = self.get_html(path)
            else:
                response = self.get_data(path)
        elif method == 'POST':
            pass

        return response

    def get_html(self,path):
        if path == '/':
            get_file = STATIC_DIR + "/index.html"
        else:
            get_file = STATIC_DIR + path
        try:
            fd = open(get_file)
        except IOError :
            #没有找到请求网页
            responseHeaders = "HTTP/1.1 404 not found\r\n"
            responseHeaders += '\r\n'
            response_body = "Sorry,the page not found"
        else:
            responseHeaders = "HTTP/1.1 200 OK\r\n"
            responseHeaders += '\r\n'
            response_body = fd.read()
        finally:
            response = responseHeaders + response_body
            return response

    def get_data(self,path):
        for url,handler in self.urls:
            if path == url:
                response_headers = "HTTP/1.1 200 OK\r\n"
                response_headers += '\r\n'
                response_body = handler()
                return response_headers + response_body 

        response_headers = "HTTP/1.1 404 not found\r\n"
        response_headers += '\r\n'
        response_body = "Sorry ,not found the data" 
        return response_headers + response_body

urls = [
    ('/time',show_time),
    ('/hello',say_hello),
    ('/bye',say_bye),
]

app = Application(urls)


views


# views.py
# 具体处理模块


import time

def show_time():
    return time.ctime()

def say_hello():
    return "hello world"

def say_bye():
    return "Good Bye"








python 的httpserver模块
            python2 BaseHTTPServer
            python3 http.server
示例:
     
try:
    from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
except ImportError:
    from http.server import BaseHTTPRequestHandler,HTTPServer

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        print(self.headers) #请求头
        print(self.path)  #请求内容
        fd = open('test.html','rb')
        content = fd.read()
        #组织response
        self.send_response(200)
        self.send_header('Content-Type','text/html')
        self.end_headers()
        self.wfile.write(content)

    def do_POST(self): 
        pass


address = ('0.0.0.0',8080)
#生成httpserver对象
httpd = HTTPServer(address,RequestHandler)
httpd.serve_forever() #启动服务器

相关文章
|
2月前
|
Python
Python项目配置Dockerfile
该Dockerfile基于阿里云Alinux3的Python 3.11.1镜像构建,使用阿里云PyPI镜像加速依赖安装,部署一个运行于5000端口、时区为上海的Python应用。
147 1
|
11天前
|
异构计算 Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
123 1
|
24天前
|
API 语音技术 开发者
Python 项目打包,并上传到 PyPI,分享项目
本文介绍了如何使用 Poetry 打包并发布一个 Python 项目至 PyPI。内容包括:项目创建、配置 `pyproject.toml` 文件、构建软件包、上传至 PyPI、安装与使用。通过实例 iGTTS 展示了从开发到发布的完整流程,帮助开发者快速分享自己的 Python 工具。
|
11天前
|
人工智能 Shell Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
102 0
|
4月前
|
监控 大数据 API
Python 技术员实践指南:从项目落地到技术优化
本内容涵盖Python开发的实战项目、技术攻关与工程化实践,包括自动化脚本(日志分析系统)和Web后端(轻量化API服务)两大项目类型。通过使用正则表达式、Flask框架等技术,解决日志分析效率低与API服务性能优化等问题。同时深入探讨内存泄漏排查、CPU瓶颈优化,并提供团队协作规范与代码审查流程。延伸至AI、大数据及DevOps领域,如商品推荐系统、PySpark数据处理和Airflow任务编排,助力开发者全面提升从编码到架构的能力,积累高并发与大数据场景下的实战经验。
Python 技术员实践指南:从项目落地到技术优化
|
4月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
120 1
|
5月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
263 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
6月前
|
程序员 测试技术 开发工具
怎么开发Python第三方库?手把手教你参与开源项目!
大家好,我是程序员晚枫。本文将分享如何开发Python第三方库,并以我维护的开源项目 **popdf** 为例,指导参与开源贡献。Popdf是一个PDF操作库,支持PDF转Word、转图片、合并与加密等功能。文章涵盖从fork项目、本地开发、单元测试到提交PR的全流程,适合想了解开源贡献的开发者。欢迎访问[popdf](https://gitcode.com/python4office/popdf),一起交流学习!
216 21
怎么开发Python第三方库?手把手教你参与开源项目!
|
9月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
370 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
7月前
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
733 1

热门文章

最新文章

推荐镜像

更多