一:web框架的本质,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
1.1:python实现:
#!/usr/bin/env python #coding:utf-8 import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, Seven") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8000)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
1.2:实现方式:
自己实现socket,Tornado
基于wsgi实现,Django
server_names = { 'cgi': CGIServer, 'flup': FlupFCGIServer, 'wsgiref': WSGIRefServer, 'waitress': WaitressServer, 'cherrypy': CherryPyServer, 'paste': PasteServer, 'fapws3': FapwsServer, 'tornado': TornadoServer, 'gae': AppEngineServer, 'twisted': TwistedServer, 'diesel': DieselServer, 'meinheld': MeinheldServer, 'gunicorn': GunicornServer, 'eventlet': EventletServer, 'gevent': GeventServer, 'geventSocketIO':GeventSocketIOServer, 'rocket': RocketServer, 'bjoern' : BjoernServer, 'auto': AutoServer, }
1.3:WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。
python标准库提供的独立WSGI服务器称为wsgiref。
#!/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')]) return '<h1>Hello, web!</h1>' #路由系统根据用户请求的不同URL返回不同的页面 if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print "Serving HTTP on port 8000..." httpd.serve_forever()
#执行结果:
1.4:自定义一个web框架:
#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_server def index(): return 'index' def login(): return 'login' def routers(): urlpatterns = ( ('/index/',index), ('/login/',login), ) return urlpatterns def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ['PATH_INFO'] urlpatterns = routers() func = None for item in urlpatterns: if item[0] == url: func = item[1] break if func: return func() else: return '404 not found' if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print "Serving HTTP on port 8000..." httpd.serve_forever()
1.4:MVC和MTV的区别:
MVC: Models:操作数据库 Views:放置HTML模板 Controllers 处理用户请求 MTV: Models:操作数据库相关 Temalate:放置HTML模板 viers处理用户请求,Django就是这种模式
二:通过python实现web框架
2.1:安装python:
#pip3 install django #这是python 3.5.1的版本
2.2:设置环境变量:
2.3:创建django project:
2.3.1#命令行方式:django-admin startproject mysite
2.3.2#图形方式:file-new project-Django-Create-新窗口打开
3:创建并启动app,app共享project里面的数据,app是用来响应用户请求的,每一个类型的网站就是一个app,相当于一个业务:
3.1:进入到project目录,执行命令python3 manage.py startapp cmdb启动创建一个app
3:1.2:写一个路由映射,写一个函数,只要url符合规则就执行函数,函数return一个值,这就是一个完整的url请求
3.1.3:配置index函数
3.1.4:启动app:
#命令启动:python manage.py runserver 127.0.0.1:8000
#图形启动1:先配置,右上角-edit configrations:
#图形启动2,点运行:
3.1.5:启动信息:
3.1.6:访问页面:
3.2:配置从html文件给用户返回,html在MTV架构里面要放在templates目录里面:
3.2.1:定义一个html文件:
3.2.2:配置返回web页面:
3.2.3:测试访问:
3.2.4:使用settings配置文件定义模板路径:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #获取到主目录mysite_django的绝对路径 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] #将templates目录添加到BASE_DIR环境变量,如果有别的目录就在这里添加到BASE_DIR目录,确认路径可以被找到 , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
3.2.5:定义存放静态页面的路径:
3.2.6:配置html引用statics目录中的静态文件,css等属于是静态文件:
3.3:访问页面测试:
3.3.1:jQuery打开页面: