一、前言

二、框架结构及实现流程

三、总结

一、前言

  当我们了解了Web应用和Web框架,以及HTTP协议的原理之后,我们可以自己动手DIY一个最简单的WEB框架,以加深对Web框架的理解,并为即将学习的Django探探路。

二、框架结构及实现流程

  1.框架结构的内容如下图所示

  我们DIY的这个Web框架按照启动的先后顺序,大致分为这样几个部分,分别是models.py、manage.py、urls.py、views.py、templates(html文件)五个部分,下面我们分别对这五个部分进行实现,最后,进行运行测试,验证框架的的可用性。

  2.实现流程

  (1) models.py -- 与数据库相关的,在我们的项目启动前,利用models.py在数据库中创建表结构,注意,仅运行一次。

  1. #!/usr/bin/env python3
  2. #!-*- coding:utf-8-*-
  3. # write by cc
  4.  
  5. import pymysql
  6.  
  7. # 1.建立连接
  8. conn = pymysql.connect(
  9. host = 'localhost',
  10. port = 3306,
  11. user = 'cc1',
  12. password = 'cc111',
  13. db = 'db1',
  14. charset = 'utf8'
  15. )
  16.  
  17. # 2.获取游标
  18. cursor = conn.cursor()
  19. # cursor = conn.cursor(pymysql.cursor.DictCursor) # 设游标类型为字典类型
  20.  
  21. # 3.执行sql语句
  22. sql = "create table users(id int,user char(12),pwd char(12))"
  23. rows = cursor.execute(sql)
  24. print(rows) # 打印受影响的记录条数
  25.  
  26. # 4.提交(必须提交,才能实现操作)
  27. conn.commit()
  28.  
  29. # 5.关闭游标和连接
  30. cursor.close()
  31. conn.close()

  (2) manage.py -- 项目的启动文件

  1. from wsgiref.simple_server import make_server
  2.  
  3. from urls import url_list
  4.  
  5. def application(environ,start_response):
  6. path = environ.get("PATH_INFO")
  7. print(path)
  8. start_response("200 OK",[('Content-Type','text/html')])
  9.  
  10. func = None
  11. for item in url_list:
  12. if path == item[0]:
  13. func = item[1]
  14. break
  15. if func:
  16. return [func(environ)]
  17. else:
  18. return [b'404 Not found']
  19.  
  20. if __name__ == '__main__':
  21. httpd = make_server("",8080,application) # 指定端口
  22. print('Serving HTTP on port 8080...')
  23. httpd.serve_forever() # 开启监听

  (3) urls.py -- url控制器,反映路径与视图函数的映射关系

  1. from app01.views import *
  2.  
  3. url_list = [
  4. ('/favcion.ico',fav),
  5. ('/index',index),
  6. ('/login',login),
  7. ('/reg',reg),
  8. ('/timer',timer),
  9. ('/auth',auth)
  10. ]

  (4) views.py -- 视图函数,固定接收一个形式参数:environ

  1. from urllib.parse import parse_qs
  2. def fav(environ):
  3. with open('templates/favcion.ico','rb') as f:
  4. data = f.read()
  5. return data
  6.  
  7. def index(environ):
  8. with open('templates/index.html','rb') as f:
  9. data = f.read()
  10. return data
  11.  
  12. def login(environ):
  13. with open('templates/login.html','rb') as f:
  14. data = f.read()
  15. return data
  16.  
  17. def reg(environ):
  18. with open('templates/reg.html','rb') as f:
  19. data = f.read()
  20. return data
  21.  
  22. def timer(environ):
  23. import datetime
  24. now = datetime.datetime.now().strftime("%y-%m-%d %X")
  25. return now.encode('utf-8')
  26.  
  27. def auth(environ):
  28. try:
  29. request_body_size = int(environ.get('CONTENT_LENGTH',0))
  30. except(ValueError):
  31. request_body_size = 0
  32. request_body = environ['wsgi.input'].read(request_body_size)
  33. data = parse_qs(request_body)
  34.  
  35. # 解析出用户输入的用户名和密码
  36. user = data.get(b'user')[0].decode('utf8')
  37. pwd = data.get(b'pwd')[0].decode('utf8')
  38.  
  39. # 连接数据库
  40. import pymysql
  41. conn = pymysql.connect(host='localhost',port=3306,user='cc1',password='cc111',db='db1',charset='utf8')
  42.  
  43. # 创建游标
  44. cursor = conn.cursor()
  45.  
  46. # 执行数据查询、插入等操作
  47. sql = 'select * from users where user=%s and pwd=%s'
  48. cursor.execute(sql,(user,pwd))
  49.  
  50. # 验证是否能取出相关记录
  51. if cursor.fetchone():
  52. print(cursor.fetchone())
  53. f = open('templates/backend.html','rb')
  54. data = f.read()
  55. data = data.decode('utf8')
  56. return data
  57. else:
  58. return b'user or password is wrong'

  (5) templates -- 储存 html 文件,当用户输入的路径正确存在与url控制器中时,为用户展示指定的页面。

  favcion.ico 是一个缩略图,可自由指定。

  index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <h1>Hello world!</h1>
  9. <h2>Boys and girls!</h2>
  10. <h3><a href="https://www.cnblogs.com/schut"/>This is my web</a></h3>
  11. <img src="https://pic.cnblogs.com/avatar/1209144/20170813234607.png">
  12. </body>
  13. </html>

  login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>登录</title>
  6. </head>
  7. <body>
  8. <h1>Hello world!</h1>
  9. <h2>Boys and girls!</h2>
  10. <form action="http://127.0.0.1:8080/auth" method="post">
  11. 姓名<input type="text" name="user">
  12. 密码<input type="password" name="pwd">
  13. <input type="submit">
  14. </form>
  15. </body>
  16. </html>

  reg.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册页面</title>
  6. </head>
  7. <body>
  8. <h3>欢迎来到注册页面</h3>
  9. <form action="" method="post">
  10. 用户名:<input type="text" name="username"><br/>
  11. 密 码:<input type="password" name="pwd"><br/>
  12. 再次输入密码:<input type="password" name="pwd2"><br/>
  13. <input type="submit">
  14. <input type="reset">
  15. </form>
  16. </body>
  17. </html>

  backend.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>index</title>
  6. </head>
  7. <body>
  8. <h2>欢迎登录</h2>
  9. </body>
  10. </html>

三、总结

  以上DIY的简易框架,大致可以分为五个部分,各自承担不同的作用,缺一不可。

  1. manage.py -- 启动文件,封装socket
  2. 1 urls.py -- 路径与视图函数的映射关系 ------------- url控制器
  3. 2 views.py -- 视图函数,固定接收一个形式参数:environ ------- 视图函数
  4. 3 templates文件夹 -- html文件 -------模板
  5. 4 models --在项目启动前,在数据库中创建表结构 ----- 与数据库相关

  

DIY一个Web框架的更多相关文章

  1. 2、基于wsgiref模块DIY一个web框架

    一 web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...

  2. 第一个web框架tornado

    简介 tornado,是我学到的第一个web框架是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google ...

  3. Go语言笔记[实现一个Web框架实战]——EzWeb框架(一)

    Go语言笔记[实现一个Web框架实战]--EzWeb框架(一) 一.Golang中的net/http标准库如何处理一个请求 func main() { http.HandleFunc("/& ...

  4. 手把手和你一起实现一个Web框架实战——EzWeb框架(二)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(二)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 上一篇文章我们实现了框架的雏形,基本地 ...

  5. 手把手和你一起实现一个Web框架实战——EzWeb框架(三)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(三)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 本篇代码,请选择demo3 这一篇文章 ...

  6. 手把手和你一起实现一个Web框架实战——EzWeb框架(四)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(四)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 这一篇文章主要实现路由组功能.实现路由 ...

  7. 手把手和你一起实现一个Web框架实战——EzWeb框架(五)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(五)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 本篇代码,请选择demo5 中间件实现 ...

  8. Python高级网络编程系列之终极篇---自己实现一个Web框架

    通过前面几个小节的学习,现在我们想要把之前学到的知识点给串联起来,实现一个很小型的Web框架.虽然很小,但是用到的知识点都是比较多的.如Socket编程,装饰器传参在实际项目中如何使用.通过这一节的学 ...

  9. luci框架-LUA的一个web框架使用

    转自:http://blog.csdn.net/initphp/article/details/17527639 LUCI 这个在百度上搜索除了一篇我的百度文库 luci 的介绍文章之外,前三页都是些 ...

随机推荐

  1. ICEM-结构化网格interface的做法

    原视频下载地址:http://yunpan.cn/cLHTCfRVNmihZ  访问密码 2ead

  2. DotNet Resource

    目录 API 应用框架(Application Frameworks) 应用模板(Application Templates) 人工智能(Artificial Intelligence) 程序集处理( ...

  3. [Beta]第十次 Scrum Meeting

    [Beta]第十次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/5/20 22:00 20min 大运村公寓6F寝室 附Github仓库:WEDO 例会照片 工作情况 ...

  4. elementUI 的el-dialog作为子组件,父组件如何控制其关闭的按钮

    这里有三点需要说明: 1. 使用:before-close="closeHandle" 将其 $emit() 出去 2. 取消按钮 也需要$emeit出去 3. 控制对话框显示隐藏 ...

  5. cordova添加plugin的多种方式

    #在线安装 cordova create chankoujie com.example.chankoujie ChanKouJie cordova plugin add cordova-plugin- ...

  6. Tengine的说明

    什么是Tengine 官方帮助文档:http://tengine.taobao.org/changelog_cn.html

  7. jwplayer :若请求不到流,则页面一直转圈请求效果

    思路: 利用jwplayer onPlay(播放) .onError(出错)事件. 页面:背景图为黑色,嵌入一张背景为黑色的 git 动态图,加载页面时隐藏. 流程:若进入到onPlay 方法,则说明 ...

  8. easyui datagrid 中序列化后的日期格式化

    1.在easyui datagrid 中序列化后的日期显示为:/Date(1433377800000)/ 2.格式化后的显示为: 2015-06-04 08:30:00 3.使用代码如下: 3.1. ...

  9. 禅道的使用—bug管理工具

    简介 禅道项目管理软件集产品管理.项目管理.质量管理.文档管理.组织管理和事务管理于一体,是一款功能完备的项目管理软件,完美地覆盖了项目管理的核心流程. 1.禅道使用的基本流程 禅道管理软件中,核心的 ...

  10. python:pytest中的setup和teardown

    原文:https://www.cnblogs.com/peiminer/p/9376352.html 之前我写的unittest的setup和teardown,还有setupClass和teardow ...