Maison  >  Article  >  développement back-end  >  Comment implémenter un framework d'application Web simple à l'aide de Python ?

Comment implémenter un framework d'application Web simple à l'aide de Python ?

WBOY
WBOYavant
2023-05-07 13:19:081900parcourir

    Avez-vous besoin d'écrire le serveur sous-jacent lors de l'écriture d'un framework d'application

    Il y a deux situations à distinguer Si. vous appliquez le framework, vous ne l'avez pas. En vous référant au standard WSGI, vous devez définir un ensemble de vos propres serveurs avant d'écrire le framework d'application. Bien entendu, cet article n'adopte pas cette approche. . Les choses professionnelles doivent être faites par des professionnels. Nous allons écrire un framework conforme à la norme WSGI, il nous suffit donc d'introduire un serveur conforme à 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

    Alors qu'est-ce que c'est. le wsgiEt le serveur ? Voici 2 exemples simples <p></p> <ul class=" list-paddingleft-2"> <li> <img src="https://img.php.cn/upload/article/000/887/227/168343675050481.png" alt="Comment implémenter un framework dapplication Web simple à laide de Python ?"><code>uwsgi : Ce serveur est écrit en utilisant c , conteneur d'applications avec un large éventail de scénarios d'application. En plus de prendre en charge WSGI, il prend également en charge d'autres protocoles, tels que HTTP, WebSocket, etc. Non seulement cela, il fournit également plusieurs modes de fonctionnement tels que multi-processus, multi-thread, coroutine, IO asynchrone, etc., et fournit également de nombreuses fonctions avancées, telles que le partage de mémoire, les tâches planifiées, le déploiement rapide à chaud, etc.
  • #🎜🎜#serveuse : Ce serveur est écrit en utilisant python. C'est un multi A très léger, très fiable et prenant en charge. -serveur WSGI à thread qui peut être utilisé pour exécuter des applications Python Web. #🎜🎜#
  • #🎜🎜##🎜🎜# Le framework web de cet article utilise uswgi. #🎜🎜#

    Utilisation de base de uwsgi

    #🎜🎜#Les informations sur uwsgi ont été brièvement présentées ci-dessus. Ce paragraphe présentera brièvement l'installation et l'installation de uwsgi. Configuration simple. #🎜🎜#

    Installer uwsgi

    #🎜🎜#Installer uwsgi, en python, utiliser directement pip pour l'installer Oui, par exemple : #🎜🎜#
    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

    Configuration de uwsgi

    #🎜🎜#uwsgi prend en charge plusieurs formats et peut être utilisé directement sur la ligne de commande, par exemple : #🎜🎜 #
    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)
    # 🎜🎜#Vous pouvez également écrire ce qui précède dans la commande, par exemple : #🎜🎜#
    uwsgi --http :8080 --wsgi-file main.py --callable app
    #🎜🎜#Le contenu de myapp.ini est le suivant : #🎜🎜#rrreee #🎜🎜#De plus, uwsgi prend également en charge plusieurs formats, tels que : xml, yaml, json , etc. #🎜🎜##🎜🎜#Le fichier de configuration peut aussi être sous la forme de url, par exemple : #🎜🎜#rrreee

    configuration commune uwsgi

    #🎜🎜#Specify startup Utilisateurs et groupes d'utilisateurs du processus uwsgi#🎜🎜#rrreee#🎜🎜#Le démarrage mentionné ci-dessus du processus uwsgi utilise le pdudo utilisateur, et le groupe utilise pdudoGroups#🎜🎜##🎜🎜#Spécifiez le nom du projet#🎜🎜##🎜🎜#Utilisez project pour spécifier le nom du projet, tel que project=pdudoProject# 🎜🎜##🎜🎜#Spécifiez le répertoire personnel du processus#🎜🎜##🎜🎜#Utilisez base pour spécifier le répertoire personnel du processus, tel que as base=/home/pdudo/# 🎜🎜##🎜🎜#Définir le nombre de processus#🎜🎜##🎜🎜#Pour définir le nombre de processus, vous devez définir master sur True d'abord, puis définissez Le nombre de processus. Il est recommandé que le nombre de processus ne dépasse pas le nombre de cpu<.> cores, par exemple : #🎜🎜#rrreee#🎜🎜#Définir l'adresse <code>http externe# 🎜🎜##🎜🎜#Si vous souhaitez communiquer en externe, il existe de nombreuses configurations, telles que socket, etc., mais le plus couramment utilisé est http On pointe directement vers un socket L'adresse suffit, par exemple : #🎜🎜#rrreeeDémarrage et arrêt d'uwsgi#🎜🎜#Démarrer le serveur#🎜🎜##🎜🎜#Utiliser directement uwsgi peut démarrer la configuration, par exemple : #🎜 🎜#rrreee#🎜🎜#Si vous ne souhaitez pas définir le fichier de configuration, vous pouvez le démarrer directement depuis la ligne de commande, par exemple : #🎜🎜#rrreee#🎜🎜#Si vous souhaitez utiliser le fichier de configuration Pour démarrer, vous pouvez utiliser l'option de chargement de la configuration, par exemple : #🎜🎜##🎜🎜#Lisez la configuration depuis ini pour démarrer le serveur #🎜🎜#rrreee#🎜🎜#From json Lisez la configuration et démarrez le serveur dans #🎜🎜#rrreee#🎜🎜#Dans uwsgi, vous pouvez arrêter le serveur en envoyant un signal au processus. Le signal correspondant est. : SIGINT. #🎜🎜##🎜🎜#Fermer le serveur#🎜🎜#rrreee

    Démarrer une démo

    #🎜🎜#Nous utiliserons uwsgi pour démarrer une démo démo simple, nous écrivons d'abord une application conforme au standard WSGI Par exemple, notre démo est : #🎜🎜#rrreee. #🎜🎜 #Dans le code ci-dessus, nous définissons une fonction application, les paramètres formels sont environ et start_response, le premier est un dictionnaire, et cette dernière est une fonction, dans application, vous devez définir le statut et la phrase de la requête, ainsi que l'en-tête de la réponse. Appelez ensuite la fonction start_response, qui nécessite de transmettre les en-têtes d'état et de réponse. Enfin, un corps de message sera renvoyé. #🎜🎜##🎜🎜#Si vous ne comprenez pas cela, vous pouvez jeter un œil au standard wsgi. #🎜🎜##🎜🎜#Nous enregistrons le code ci-dessus sous main.py, puis utilisons uwsgi pour démarrer le projet : #🎜🎜#rrreee#🎜🎜# Le code ci-dessus utilise la ligne de commande pour démarrer uwsgi et spécifie le port http comme 8080. La carte réseau de surveillance n'est pas spécifiée. La valeur par défaut est. toutes les cartes réseau. , à partir du swgi-file nous spécifierons l'application wsgi que nous avons écrite nous-mêmes. #🎜🎜##🎜🎜#Après le démarrage, nous utilisons curl -v 127.0.0.1:8080/123 pour obtenir les informations suivantes : #🎜🎜##🎜🎜##🎜🎜##🎜 🎜 #

    写一个简单的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输出的信息,是有有我们定义的函数。

    Comment implémenter un framework dapplication Web simple à laide de Python ?

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

    Comment implémenter un framework dapplication Web simple à laide de Python ?

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

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer