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
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Sublime 텍스트로 Python 코드를 실행하려면 먼저 Python 플러그인을 설치 한 다음 .py 파일을 작성하고 코드를 작성한 다음 CTRL B를 눌러 코드를 실행하면 콘솔에 출력이 표시됩니다.

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

Visual Studio Code (VSCODE)에서 코드를 작성하는 것은 간단하고 사용하기 쉽습니다. vscode를 설치하고, 프로젝트를 만들고, 언어를 선택하고, 파일을 만들고, 코드를 작성하고, 저장하고 실행합니다. VSCODE의 장점에는 크로스 플랫폼, 무료 및 오픈 소스, 강력한 기능, 풍부한 확장 및 경량 및 빠른가 포함됩니다.

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.
