python web框架学习笔记
一、web框架本质
1.基于socket,自己处理请求
#!/usr/bin/env python3 #coding:utf8 import socket def handle_request(client): #接收请求 buf = client.recv(1024) print(buf) #返回信息 client.send(bytes('<h1 id="welcome-liuyao-webserver">welcome liuyao webserver</h1>','utf8')) def main(): #创建sock对象 sock = socket.socket() #监听80端口 sock.bind(('localhost',8000)) #最大连接数 sock.listen(5) print('welcome nginx') #循环 while True: #等待用户的连接,默认accept阻塞当有请求的时候往下执行 connection,address = sock.accept() #把连接交给handle_request函数 handle_request(connection) #关闭连接 connection.close() if __name__ == '__main__': main()
2.基于wsgi
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。
WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。
WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的。
很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 。
python标准库提供的独立WSGI服务器称为wsgiref。
#!/usr/bin/env python #coding:utf-8 #导入wsgi模块 from wsgiref.simple_server import make_server def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [bytes("welcome webserver".encode('utf8'))] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever() #接收请求 #预处理请求(封装了很多http请求的东西)
请求过来后就执行RunServer这个函数。
原理图:
当用户发送请求,socket将请求交给函数处理,之后再返回给用户。
二、自定义web框架
python标准库提供的wsgiref模块开发一个自己的Web框架
之前的使用wsgiref只能访问一个url
下面这个可以根据你访问的不同url请求进行处理并且返回给用户
#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_server def RunServer(environ, start_response): start_response('200 OK', [('Content-Type','text/html')]) #根据url的不同,返回不同的字符串 #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer, #wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response] request_url = environ['PATH_INFO'] print (request_url) #2 根据URL做不同的相应 #print environ #这里可以通过断点来查看它都封装了什么数据 if request_url == '/login': return [bytes("welcome login",'utf8')] elif request_url == '/reg': return [bytes("welcome reg",'utf8')] else: return [bytes('<h1 id="no-found">404! no found</h1>','utf8')] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
当然 以上虽然根据不同url来进行处理,但是如果大量url的话,那么代码写起来就很繁琐。
所以使用下面方法进行处理
#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_server def index(): return [bytes('<h1 id="index">index</h1>','utf8')] def login(): return [bytes('<h1 id="login">login</h1>','utf8')] def reg(): return [bytes('<h1 id="reg">reg</h1>','utf8')] def layout(): return [bytes('<h1 id="layout">layout</h1>','utf8')] #定义一个列表 把url和上面的函数做一个对应 urllist = [ ('/index',index), ('/login',login), ('/reg',reg), ('/layout',layout), ] def RunServer(environ, start_response): start_response('200 OK', [('Content-Type','text/html')]) #根据url的不同,返回不同的字符串 #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer,wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response] request_url = environ['PATH_INFO'] print (request_url) #2 根据URL做不同的相应 #print environ #这里可以通过断点来查看它都封装了什么数据 #循环这个列表 找到你打开的url 返回url对应的函数 for url in urllist: if request_url == url[0]: return url[1]() else: #url_list列表里都没有返回404 return [bytes('<h1 id="not-found">404 not found</h1>','utf8')] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
三、模板引擎
对应上面的操作 都是根据用户访问的url返回给用户一个字符串的 比如return xxx
案例:
首先写一个index.html页面
内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1 id="welcome-index">welcome index</h1> </body> </html>
login.html页面
内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <h1 id="welcome-login">welcome login</h1> <form> user:<input type="text"/> pass:<input type="password"/> <button type="button">login in</button> </form> </body> </html>
python代码:
#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_server def index(): #把index页面读进来返回给用户 indexfile = open('index.html','r+').read() return [bytes(indexfile,'utf8')] def login(): loginfile = open('login.html','r+').read() return [bytes(loginfile,'utf8')] urllist = [ ('/login',login), ('/index',index), ] def RunServer(environ, start_response): start_response('200 OK', [('Content-Type','text/html')]) #根据url的不同,返回不同的字符串 #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer,wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response] request_url = environ['PATH_INFO'] print (request_url) #2 根据URL做不同的相应 #print environ #这里可以通过断点来查看它都封装了什么数据 for url in urllist: #如果用户请求的url和咱们定义的rul匹配 if request_url == url[0]: #执行 return url[1]() else: #url_list列表里都没有返回404 return [bytes('<h1 id="not-found">404 not found</h1>','utf8')] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
但是以上内容只能返回给静态内容,不能返回动态内容
那么如何返回动态内容呢
自定义一套特殊的语法,进行替换
使用开源工具jinja2,遵循其指定语法
index.html 遵循jinja语法进行替换、循环、判断
先展示大概效果,具体jinja2会在下章django笔记来进行详细说明
index.html页面
内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--general replace--> <h1 id="name">{{ name }}</h1> <h1 id="age">{{ age }}</h1> <h1 id="time">{{ time }}</h1> <!--for circular replace--> <ul> {% for item in user_list %} <li>{{ item }}</li> {% endfor %} </ul> <!--if else judge--> {% if num == 1 %} <h1 id="num">num == 1</h1> {% else %} <h1 id="num">num == 2</h1> {% endif %} </body> </html>
python代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- import time #导入wsgi模块 from wsgiref.simple_server import make_server #导入jinja模块 from jinja2 import Template def index(): #打开index.html data = open('index.html').read() #使用jinja2渲染 template = Template(data) result = template.render( name = 'yaoyao', age = '18', time = str(time.time()), user_list = ['linux','python','bootstarp'], num = 1 ) #同样是替换为什么用jinja,因为他不仅仅是文本的他还支持if判断 & for循环 操作 #这里需要注意因为默认是的unicode的编码所以设置为utf-8 return [bytes(result,'utf8')] urllist = [ ('/index',index), ] def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) #根据url的不同,返回不同的字符串 #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer, # wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response] request_url = environ['PATH_INFO'] print(request_url) #2 根据URL做不同的相应 #循环这个列表 for url in urllist: #如果用户请求的url和咱们定义的rul匹配 if request_url == url[0]: print (url) return url[1]() else: #urllist列表里都没有返回404 return [bytes('<h1 id="not-found">404 not found</h1>','utf8')] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
四、MVC和MTV
1.MVC
全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
将路由规则放入urls.py
操作urls的放入controller里的func函数
将数据库操作党风model里的db.py里
将html页面等放入views里
原理图:
2.MTV
Models 处理DB操作
Templates html模板
Views 处理函数请求
原理图:
以上就是本文的全部内容,希望对大家的学习有所帮助。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

VSコード拡張機能は、悪意のあるコードの隠れ、脆弱性の活用、合法的な拡張機能としての自慰行為など、悪意のあるリスクを引き起こします。悪意のある拡張機能を識別する方法には、パブリッシャーのチェック、コメントの読み取り、コードのチェック、およびインストールに注意してください。セキュリティ対策には、セキュリティ認識、良好な習慣、定期的な更新、ウイルス対策ソフトウェアも含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。
