>  기사  >  백엔드 개발  >  Python을 사용하여 간단한 웹 애플리케이션 프레임워크를 구현하는 방법은 무엇입니까?

Python을 사용하여 간단한 웹 애플리케이션 프레임워크를 구현하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-05-07 13:19:081852검색

    애플리케이션 프레임워크를 작성할 때 기본 서버를 작성해야 합니까?

    애플리케이션 프레임워크에 대해 WSGI 표준을 참조하지 않는 경우 두 가지 상황을 구별해야 합니다. 애플리케이션 프레임워크를 작성하기 전에 자신만의 서버 세트를 정의해야 합니다. 물론 이 문서에서는 이러한 접근 방식을 취하지 않습니다. 전문적인 작업은 전문가가 수행해야 합니다. WSGI 표준을 준수하는 프레임워크를 작성할 것이므로 WSGI를 준수하는 서버만 도입하면 됩니다. WSGI标准,那么在写应用框架之前,你就必须要定义一套属于自己的服务器,当然本文不采取这种方式,专业的事情应该专业的人来做。我们将编写符合WSGI标准的框架 ,所以仅需要引入符合WSGI的服务器即可,

    那么有哪些wsgi服务器呢? 这里简单列举2个

    • uwsgi:该服务器是使用c编写的,具有广泛的应用场景的应用程序容器。除了支持WSGI外,还支持其他协议,例如HTTPWebSocket等等。不仅如此,它还提供了多进程、多线程、协程、异步IO等多种运行模式,还提供了很多高级功能,如内存共享、定时任务、快速热部署等。

    • waitress:该服务器是使用python写的,是一个很轻量级、非常可靠、支持多线程的WSGI服务器,可以用来运行Python Web应用。

    我们本篇文章的web框架采用的就是uswgi

    uwsgi基本使用

    上面已经简单介绍了uwsgi的信息,本段落会简单介绍一下uwsgi安装和简单的配置。

    安装uwsgi

    安装uwsgi,在python中,直接使用pip安装即可,例如:

     pip3 install uwsgi

    配置uwsgi

    uwsgi支持多种格式,可以直接在命令行上,例如:

    uwsgi --http :8080 --wsgi-file myapp.py --callable app

    还可以将上述写到命令中,例如:

    uwsgi --ini myapp.ini

    其中myapp.ini内容如下:

    [uwsgi]
    http = :8080
    wsgi-file = myapp.py
    callable = app

    不仅如此,uwsgi还支持多个格式,例如: xmlyamljson等。

    配置文件也可以是url的形式,例如:

    uwsgi --ini http://127.0.0.1:8080/myapp.ini

    uwsgi常用配置

    指定启动uwsgi进程的用户和用户组

    uid=pdudo
    gid=pdudoGroups

    上述启动uwsgi进程使用pdudo用户,而组的话是使用pdudoGroups

    指定项目名称

    使用project来指定项目名称,如project=pdudoProject

    指定进程家目录

    使用base来指定进程家目录,如base=/home/pdudo/

    设置进程数

    要设置进程数,需要先将master设置为True, 而后再设置process个数,一把建议进程数不超过cpu核数,例如:

    master=True
    process=16

    设置对外http地址

    若想对外,有很多中配置,如socket等,但是一般用的最多的还是http,我们直接指向一个套接字地址即可,例如:

    http=0.0.0.0:8000

    uwsgi启服和停服

    启动服务器

    直接使用uwsgi即可启动配置,如:

     uwsgi

    若不想设置配置文件,直接可以在命令行启动,如:

    uwsgi --http :8080

    若想通过配置文件启动,则可以使用加载配置选项即可,例如:

    ini中读取配置启动服务器

    uwsgi -ini app.ini

    json中读取配置启动服务器

    uwsgi --json app.json

    uwsgi中,可以通过向进程发送信号的方式,来关闭服务器,对应的信号为: SIGINT

    关闭服务器

    kill -2 uwsgiPID

    启动一个demo

    我们将使用uwsgi来启动一个简单的demo,首先我们来编写符合WSGI标准的应用,例如,我们的demo为:

    def application(environ, start_response):
        status = "200 OK"
        headers = [("Content-type","text/html"),("Server","pdudo_web_sites")]
        start_response(status,headers)
        return [b'Hello, pdudos.']

    上述代码,我们定义了一个函数application,形参为environ以及start_response,前则是一个字典,后则是一个函数,在application中,需要定义请求的状态和短语,以及响应头。 而后调用start_response函数,需要传入状态和响应头。最后将返回一个报文主体。

    如果这块,不太明白的话,可以看一下wsgi标准。

    我们将这个上述代码保存为main.py,而后使用uwsgi来启动该项目:

    uwsgi --http :8080 --wsgi-file main.py

    上述代码,使用的命令行的方式来启动uwsgi,指定http端口为8080,监听的网卡没有指定,默认是所有网卡,从swgi-file将指定我们自己写的wsgi应用程序。

    启动后,我们使用curl -v 127.0.0.1:8080/123

    그럼 wsgi 서버? 다음은 간단히 나열된 2개입니다. <p></p> <ul class=" list-paddingleft-2"> <li> <img src="https://img.php.cn/upload/article/000/887/227/168343675050481.png" alt="Python을 사용하여 간단한 웹 애플리케이션 프레임워크를 구현하는 방법은 무엇입니까?"><code>uwsgi: 이 서버는 c를 사용하여 작성되었으며 광범위한 애플리케이션 장면의 애플리케이션 컨테이너입니다. WSGI 지원 외에도 HTTP, WebSocket 등과 같은 다른 프로토콜도 지원합니다. 뿐만 아니라 다중 프로세스, 다중 스레드, 코루틴, 비동기 IO 등과 같은 여러 운영 모드를 제공하고 메모리 공유, 예약 작업, 신속한 핫 배포 등과 같은 많은 고급 기능도 제공합니다.
  • 🎜웨이트리스: 이 서버는 python을 사용하여 작성되었으며 매우 가볍고, 매우 안정적이며 멀티스레딩 WSGI 서버는 <code>Python 웹 애플리케이션을 실행하는 데 사용할 수 있습니다. 🎜
  • 🎜🎜이 문서의 프레임워크는 uswgi를 사용합니다. 🎜

    uwsgi의 기본 사용법

    🎜위에서 uwsgi에 대한 정보를 간략하게 소개했습니다. 이번 단락에서는 uwsgi의 설치 및 간단한 구성에 대해 간략하게 소개하겠습니다. 🎜

    uwsgi 설치

    🎜 uwsgi를 설치하세요. python에서 pip를 사용하여 직접 설치하세요. 예: 🎜
    webRoute = {}
    def application(environ, start_response):
        path = environ[&#39;PATH_INFO&#39;]
        if webRoute[path]:
            func = webRoute[path]
            code , body = func(environ)
            status = "%d OK" % (code)
            headers = [("Content-type","text/html"),("Server","pdudo_web_sites")]
            start_response(status,headers)
            return [body.encode()]
    def Routes(path,func):
        print("add routes: %s %s" %(path,func))
        webRoute[path] = func

    uwsgi 구성

    🎜uwsgi는 명령줄에서 직접 사용할 수 있는 여러 형식을 지원합니다. 예: 🎜
    import myWeb
    app = myWeb.application
    def index(*args):
        return (200,"hello world")
    def d345(*args):
        return (400,"dasda")
    myWeb.Routes("/index",index)
    myWeb.Routes("/123",d345)
    🎜예를 들어 위의 내용을 명령에 쓸 수도 있습니다. : 🎜
    uwsgi --http :8080 --wsgi-file main.py --callable app
    🎜여기서 myapp.ini의 내용은 다음과 같습니다. 🎜rrreee🎜그뿐만 아니라 uwsgixml, <code>yaml code>, <code>json 등 🎜🎜구성 파일은 url 형식일 수도 있습니다. 예: 🎜rrreee

    uwsgi 일반 구성

    🎜 uwsgi를 시작하는 사용자 및 사용자 그룹을 지정하세요. process🎜 rrreee🎜 위에서 언급한 uwsgi 프로세스의 시작은 pdudo 사용자를 사용하고, 그룹의 경우 pdudoGroups를 사용합니다🎜 🎜프로젝트 이름 지정🎜🎜project를 사용하여 프로젝트 이름을 지정하세요(예: project=pdudoProject)🎜🎜프로세스 홈 디렉토리 지정🎜🎜base 사용 code>를 사용하여 <code>base=/home /pdudo/와 같이 프로세스 홈 디렉터리를 지정합니다.🎜🎜프로세스 수 설정🎜🎜프로세스 수를 설정하려면 master를 먼저 <code>True로 설정한 다음 프로세스 code> 번호를 설정하세요. 프로세스 수가 <code>cpu 코어 수를 초과하지 않는 것이 좋습니다. , 예를 들면 다음과 같습니다. 🎜rrreee🎜외부 http 주소 설정🎜🎜외부적으로 통신하려는 경우 소켓 등 많은 구성이 있지만 가장 일반적으로 사용되는 주소는 http입니다. 예를 들어 다음과 같이 소켓 주소를 직접 가리킬 수 있습니다. 🎜rrreee

    uwsgi 서버 시작 및 중지

    🎜서버 시작 🎜🎜uwsgi를 직접 사용하여 다음과 같이 구성을 시작하세요. 🎜rrreee🎜구성 파일을 설정하지 않으려면 명령줄에서 직접 시작할 수 있습니다. 예:🎜rrreee 🎜구성 파일을 통해 시작하려면 구성 로드 옵션을 사용할 수 있습니다. 예:🎜🎜ini에서 구성을 읽어 서버를 시작🎜rrreee🎜json에서 code> code>🎜rrreee🎜<code>uwsgi의 구성을 읽어 서버를 시작합니다. 해당 신호는 SIGINT입니다. 코드>. 🎜🎜<strong>서버 종료</strong>🎜rrreee<h4>데모 시작</h4>🎜 <code>uwsgi를 사용하여 간단한 데모를 시작하겠습니다. 먼저 WSGI 표준을 준수하는 애플리케이션을 작성해 보겠습니다. 예를 들어 demo는 다음과 같습니다. 🎜rrreee🎜위 코드에서 application, 형식 매개변수는 <code>environstart_response이며 전자는 사전이고 후자는 함수입니다. 요청 상태 및 문구, 응답 헤더. 그런 다음 상태 및 응답 헤더를 전달해야 하는 start_response 함수를 호출합니다. 마지막으로 메시지 본문이 반환됩니다. 🎜🎜이것이 이해되지 않는다면 wsgi 표준을 살펴보세요. 🎜🎜위 코드를 main.py로 저장한 다음 uwsgi를 사용하여 프로젝트를 시작합니다. 🎜rrreee🎜위 코드는 명령줄을 사용하여 시작합니다 uwsgi, http 포트를 8080으로 지정, 모니터링 네트워크 카드가 지정되지 않음, 기본값은 swgi-file 우리가 직접 작성한 <code>wsgi 애플리케이션을 지정합니다. 🎜🎜시작 후 curl -v 127.0.0.1:8080/123을 사용하여 다음 정보를 얻습니다. 🎜🎜🎜🎜

    写一个简单的web应用框架

    本篇文章,很大部分都在描述uwgi,这是因为我们将选用其为web服务器,所以很大的篇章都在描述它,现在,我们已经会基本的操作了,我们应该来写一个简单的web框架了。

    我们写的web框架如下:

    webRoute = {}
    def application(environ, start_response):
        path = environ[&#39;PATH_INFO&#39;]
        if webRoute[path]:
            func = webRoute[path]
            code , body = func(environ)
            status = "%d OK" % (code)
            headers = [("Content-type","text/html"),("Server","pdudo_web_sites")]
            start_response(status,headers)
            return [body.encode()]
    def Routes(path,func):
        print("add routes: %s %s" %(path,func))
        webRoute[path] = func

    哎,短短17行,我们基本的框架就写完了,厉害吧,我们将次代码保存到本地,命名为myWeb.py ,目的是和逻辑代码分开。上述代码,我们定义了一个webRoute字典来存储路由信息,我们想要存储key为请求的url,值为可被调用的函数。

    我们为此专门写了一个Routes函数,该函数将传入2个值,第一个是请求的url,第二个是可被调用的函数。

    application中,会首先获取请求的路径,而后再根据webRoute的值,进行匹配,若匹配到了,则执行该函数,该函数必须2个值,第一个是状态码,第二个是响应报文主体。 我们将根据返回的信息,组合成状态码以及响应头,通过调用start_response函数,将2个参数携带上,最后return一个报文主体。

    接下里,我们就可以写我们的逻辑代码了,我们编写如下:

    import myWeb
    app = myWeb.application
    def index(*args):
        return (200,"hello world")
    def d345(*args):
        return (400,"dasda")
    myWeb.Routes("/index",index)
    myWeb.Routes("/123",d345)

    我们将上述代码保存到本地,命名为main.py

    上述代码,我们先引用了刚刚保存到本地的myWeb文件,定义一个变量app用于引用myWeb.application函数。接着,我们便定义了2个函数,分别是indexd345,2个函数的共同之处是返回了一个元组,元组前者是int类型,将用于状态码,后则是str类型,将用于返回响应报文主体。

    最后,我们通过myWeb.Routes将2个函数于路由串联起来,分别对应为:

    • /index: index函数。

    • /123: d456函数

    我们应用框架就写完了,我们需要使用uwsgi来启动一下我们写的框架:

    uwsgi --http :8080 --wsgi-file main.py --callable app

    这里新增了一个配置项,callable该参数的意思是,指定应用起始函数,默认是application,如果不是这个名称,则需要额外指定,我们定义的是app,所以需要将其指定为app

    启动后,我们可以观察一下,我们之前在框架Routes函数中,我们打印了路由和函数的信息,我们可以看下uwsgi输出的信息,是有有我们定义的函数。

    Python을 사용하여 간단한 웹 애플리케이션 프레임워크를 구현하는 방법은 무엇입니까?

    发现没问题后,我们使用curl再来请求一下路由,验证是否有问题:

    Python을 사용하여 간단한 웹 애플리케이션 프레임워크를 구현하는 방법은 무엇입니까?

    如上结果,结果正确输出。

    위 내용은 Python을 사용하여 간단한 웹 애플리케이션 프레임워크를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제