1. 什么是 web 框架

  • 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端;
# 示例:
import socket def handle_request(client):
buf = client.recv(1024)
client.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf8'))
client.send("<h1 style='color:red'>Hello World!</h1>".encode('utf8')) def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8001))
sock.listen(5) while True:
connection, address = sock.accept()
handle_request(connection)
connection.close() if __name__=='__main__':
main()

1.2 自己搭建简易版Web框架

  • 其中,接收HTTP请求,解析HTTP请求,发送HTTP响应由WSGI接口(Web Server Gateway Interface)处理;
# Web 应用的流程:
# 1. 浏览器发送一个HTTP请求;
# 2. 服务器收到请求,生成一个HTML文档;
# 3. 服务器把HTML文档作为HTTP响应的Body发送给浏览器;
# 4. 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示; # 搭建Web框架步骤: # Step1: 服务端 from wsgiref.simple_server import make_server def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello World!</h1>'] httpd = make_server('', 8080, application) print('Serving HTTP on port 8080...')
# 开始监听HTTP请求
httpd.serve_forever() # 备注:
# 整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,
# 我们只负责在更高层次上考虑如何响应请求就可以了 # application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。 # Python 内置了一个WSGI服务器,这个模块叫 wsgiref # application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
# environ: 一个包含所有HTTP请求信息的dict对象
# start_response: 一个发送HTTP响应的函数
# start_response() 函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header
# 每个Header用一个包含两个str的tuple表示 # Step2: 从environ中获取请求参数
print(environ['PATH_INFO'])
path=environ['PATH_INFO']
start_response('200 OK', [('Content-Type', 'text/html')])
f1=open('index.html', 'rb')
data1=f1.read()
f2=open('index2.html', 'rb')
data2=f2.read() if path=='/book':
return [data1]
elif path=='/phone':
return [data2]
else:
return ['<h1>404</h1>'.encode('utf8')] # Step3:
from wsgiref.simple_server import make_server def f1(req):
print(req)
print(req['QUERY_STRING']) f1=open('index.html', 'rb')
data=f1.read()
return [data] def f2(req):
f2.open('index2.html', 'rb')
data2=f2.read()
return [data2] import time def f3(req): # 显示当前时间
f3=open('index3.html','rb')
data3=f3.read()
times=time.strftime('%Y-%m-%d %X', time.localtime())
data3=str(data3, 'utf8').replace('!time!', str(times)) return [data3.encode('utf8')] def routers():
urlpatterns = (
('/book',f1),
('/phone',f2),
('/movie',f3)
)
return urlpatterns def application(environ, start_response): print(environ['PATH_INFO'])
path=environ['PATH_INFO']
start_response('200 OK', [('Content-Type', 'text/html')]) urlpatterns = routers()
func = None
for item in urlpatterns:
if item[0] == path:
func = item[1]
break
if func:
return func(environ)
else:
return ['<h1>404</h1>'.encode('utf8')] httpd=make_server('', 8085, application) print('Serving HTTP on port 8085...') # 开始监听HTTP请求
httpd.serve_forever() # index3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index3</title>
</head>
<body>
<h1>!time!</h1>
</body>
</html>

2. MVC和MTV模式

  • MVC模式:就是把Web应用分为模型(M),控制器(C),视图(V)三层;
  • Django框架采用MTV模式,MTV和MVC模式本质上没有什么茶杯,知识定义上有些不同:
    • Model(模型):负责业务对象与数据库的对象(ORM);
    • Template(模板):负责如何把页面展示给用户;
    • View(视图):负责业务逻辑,并在适当的时候调用Model和Template;
    • 此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view

      再调用响应的Model和Template;
# 示例: django 入门搭建

# 安装Django
pip3 install django # 1. 创建project
django-admin startproject mysite # 在iTerm中输入,mysite表示项目的名称 # mysite 文件夹
# mysite子文件夹
# __init__.py
# settings.py # 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量
# urls.py # 负责把URL模式映射到应用程序
# wsgi.py
# manage.py(项目启动文件) # Django项目里的工具,通过它可以调用 django shell和数据库等 # 2. 创建 APP
# 在mysite文件夹下,执行
python3 manage.py startapp blog # blog 为自定义app名称 # 3. mysite/mystite/urls.py
from blog import views urlpatterns = [
path(r'admin/', admin.site.urls),
path(r'cur_time', views.cur_time) # r 表示原生字符串 path(r'index.html', views.userInfo)
] # 4. mysite/blog/views.py
from django.shortcuts import render, HttpResponse
import datetime def cur_time(request):
# return HttpResponse('<h1>OK</h1>')
times = datetime.datetime.now()
return render(request, 'cur_time.html', {'abc':times}) user_list = []
def userInfo(req):
if req.method='POST':
username=req.POST.get('username',None)
gender=req.POST.get('gender',None)
email=req.POST.get('email',None) user_list.append(user) return render(req, 'index.html', {'user_list':user_list}) # 5. mysite/templates/cur_time.html
<body>
<!-- {{}} 为模板语言 -->
<h1>当前时间:{{abc}}</h1>
</body> # mysite/templates/index.html
<body>
<form action="/userInfo" method="post">
<p>姓名<input type="text" name="username"></p>
<p>性别<input type="text" name="gender"></p>
<p>邮箱<input type="email" name="email"></p>
<p><input type="submit" value="submit"></p>
</form> <hr/>
<h1>数据展示</h1>
<table border="1">
<tr>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
</tr>
{% for i in user_list %}
<tr>
<td>{{i.username}}</td>
<td>{{i.gender}}</td>
<td>{{i.email}}</td>
</tr>
{% endfor %}
</table>
</body> # 6. 启动Django项目
# 此处,注意为 python3
python3 manage.py runserver 127.0.0.1:8080 # 示例二: 将数据存储到数据库
# 1. mysite/blog/models.py
from django.db import models class UserInfo(models.Model):
username=models.CharField(max_length=64)
gender=models.CharField(max_length=64)
email=models.CharField(max_length=64) # 2. 初始化数据库
python3 manage.py makemigrations
python3 manage.py migrate # 3. mysite/blog/views
from blog import models def userInfo(req):
if req.method=='POST':
u=req.POST.get('username',None)
g=req.POST.get('gender',None)
e=req.POST.get('email',None) # 存储到数据库
models.UserInfo.objects.create(
username=u,
gender=g,
email=e
) # 取出数据库中的数据
user_list=models.UserInfo.objects.all() return render(req, 'index.html', {'user_list':user_list})

备注: PyCharm 需要下载sqlite相关驱动

参考资料:

Django 框架搭建入门案例的更多相关文章

  1. Django框架搭建(windows系统)

    Django框架搭建(windows系统) 一.Django简介 开放源代码的Web应用框架,由Python语言编写,一个大而全的框架. 1.web框架介绍 具体介绍Django之前,必须先介绍WEB ...

  2. Python必学Django框架,入门到精通学习视频教程全都在这可以领

    “人生苦短,我用python”,学python的小伙伴应该都了解这句话的含义.但是,学python,你真正了了解强大的Django框架吗!? 据说Django还是由吉普赛的一个吉他手的名字命名的呢,有 ...

  3. springCloud 微服务框架搭建入门(很简单的一个案例不喜勿扰)

    Spring cloud 实现服务注册及发现 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. clou ...

  4. Hibernate框架之入门案例

    今天终于开始学习了三大框架的其中一个框架,Hibernate框架,在这里不去讲Hibernate框架的一些基础概念了,直接切入代码,带大家了解一下Hibernate能干什么, Hibernate的人们 ...

  5. Dubbo——基于Zookeeper服务框架搭建及案例演示

    一.了解SOA微服务架构 在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡. (1) 当服务越来 ...

  6. django框架搭建web服务

    一.工具 环境:windows 7 python 2.7.7     下载地址:https://www.python.org/downloads/release/python-2713/   ps:这 ...

  7. Python3之Django框架搭建详细步骤

    安装Django 自行下载的pip,可执行如下命令: pip install django 下载python3版本可以自带pip3 ,命令如下: pip3 install django 此命令会下载d ...

  8. 分布式事务框架 Seata 入门案例

    1.  Seata Server 部署 Seata分TC.TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成. 首先,下载最新的安装包 也可以下载源 ...

  9. 分布式服务框架Dubbo入门案例和项目源码

    本项目源代码:http://download.csdn.net/detail/fansunion/9498406 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案, 是 ...

随机推荐

  1. IBM MQ 2035 或 2013认证错误的解决方法

    第一种方法: ALTER CHL(SYSTEM.BKR.CONFIG) CHLTYPE(SVRCONN) ALTER CHL(SYSTEM.ADMIN.SVRCONN) CHLTYPE(SVRCONN ...

  2. 转:linux添加用户

    功能说明:建立用户帐号. 语 法:useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][- ...

  3. Unix系统编程()发送信号kill

    与shell的kill命令类似,一个进程能够使用kill系统调用向另一进程发送信号. 之所以选择kill作为术语,因为早期UNIX实现中大多数信号的默认行为是终止进程. #include <si ...

  4. AM335x 添加 HUAWEI MU609 Mini PCIe Module,并用pppd 启动相关设备

    kernel 的配置 kernel 3.2.0 make menuconfig Device Drivers ---> [*] USB support ---> <*> USB ...

  5. [uboot]uboot如何引导系统

    转自:http://bbs.elecfans.com/jishu_455028_1_1.html 如6410的bootcmd和bootargs默认存在于uboot1.1.6/include/confi ...

  6. 在ubuntu下安装sourceinsight

    执行更新与安装 wine: # sudo apt-get update # sudo apt-get install wine 下载SourceInsight,用wine来安装: 执行:wine so ...

  7. mongdb 慢查询

    查看mongodb慢查询 赶紧打开服务器爸爸,开慢查询,看下耗时500ms以上的都是些啥: db.setProfilingLevel(2,500) 看下最近的10条具体的慢查询指令: db.syste ...

  8. 代码生成利器:IDEA 强大的 Live Templates

    Java 开发过程经常需要编写有固定格式的代码,例如说声明一个私有变量, logger 或者 bean 等等.对于这种小范围的代码生成,我们可以利用 IDEA 提供的 Live Templates 功 ...

  9. 硬件设计之串口收发器---ISO1050 (现行) 隔离式 5V CAN 收发器

    http://www.ti.com.cn/product/cn/iso1050 http://www.deyisupport.com/question_answer/dsp_arm/sitara_ar ...

  10. EF 序列化实体为Json时的循环引用问题(不用自己写实体,不用匿名类型,不用EF的上下文属性)

    自己写实体可以完美解决这个问题.(支持时间格式自定义) 用匿名类型也可以. 设置上下文方法如下: (jz为数据库上下文对象) jz.Configuration.ProxyCreationEnabled ...