WSGI

WSGI(Web Server Gateway Interface)web服务器网关接口。它是python下的一个标准,定义了web服务器和web应用或框架之间一种简单而通用的接口。在python中,它的具体实现是wsgiref模块。客户端(浏览器)把http请求发送给web服务器,web服务器封装请求,再把请求发送给web应用,web应用处理请求,通过web服务器,将响应返回给客户端。

手动实现一个web框架

为了更好的理解web框架,我们来试着手动实现一个简单的web框架。先写基本的逻辑:

from wsgiref.simple_server import make_server  # 引用类route = {}  # 用来存储url path 和函数的对应关系的路由def deco(name): # 装饰器,自动添加视图函数到路由def wrapper(func):route[name] = funcreturn wrapper@deco('/login')
def login(request):with open('login.html', 'rb')as f:return [f.read()]@deco('/auth')
def auth(request):# environ对象的QUERY_STRING键对应用户提交的用户名和密码,我们将它提取出来。login_info = request.get('QUERY_STRING')  # user=ayhan&pwd=123user, pwd = login_info.split('&')_, user = user.split('=')_, pwd = pwd.split('=')if user == 'ayhan' and pwd == '123':return [b'login ok!']else:return [b'user or password error']def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])# environ ; 由wsgiref封装了请求信息的对象。# start_response响应头:状态码 + 键值对# 最简单的响应如下,直接返回一个bytes字符串# msg = '<h1>hello world</h1>'# return [msg.encode('utf-8')]    # 注意,要加[]# 实际中应该根据用户的请求,返回不同的响应path = environ.get('PATH_INFO')# 获取请求路径,通过它来判断用户访问的路径,来返回不同的页面# if path == '/seb':#     with open('seb.html','rb')as f:#         data = f.read()#     return [data]# elif path == '/tom':#     pass# else:#     return [b'404']# 不用if判断,用路由来处理请求,调用对应的视图函数if path in route:  # 路由分发res = route[path](environ)return reselse:return [b'404']server = make_server("", 8080, application)  # 实例化一个WSGI服务器对象(底层基于socket),监听ip和端口
# 不写默认本机ip; 重写application方法
server.serve_forever()  # 运行服务器,调用application

将上述代码用包和模块的方式组织起来,就是一个简单的框架:

程序主逻辑 bin.py如下:

from wsgiref.simple_server import make_server  # 引用类
from views import *def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])path = environ.get('PATH_INFO')if path in route:  # 路由分发res = route[path](environ)return reselse:return [b'404']if __name__ == '__main__':server = make_server("", 8080, application)

视图函数如下:

route = {}  # 用来存储url path 和函数的对应关系的路由def deco(name): # 装饰器,自动添加视图函数到路由def wrapper(func):route[name] = funcreturn wrapper@deco('/login')
def login(request):with open('templates/login.html', 'rb')as f:return [f.read()]@deco('/auth')
def auth(request):# environ对象的QUERY_STRING键对应用户提交的用户名和密码,我们将它提取出来。login_info = request.get('QUERY_STRING')  # user=ayhan&pwd=123user, pwd = login_info.split('&')_, user = user.split('=')_, pwd = pwd.split('=')if user == 'ayhan' and pwd == '123':return [b'login ok!']else:return [b'user or password error']

这样,一个简单的web框架就完成了,只需添加视图函数和模板,就可以可扩展其功能。

初识Django

Django是用python开发的一个开源web框架。有了它,我们可以专注于编写清晰、易维护的代码。

1 创建项目

在终端输入如下命令,可以创建一个项目:
django-admin startproject project_name,项目名可以自定义,这里我们创建一个名为myweb的项目,创建完成后,可以看到如下的目录结构:

项目名根目录下分别有manage.py和一个全局文件夹myweb:
- manage.py 命令行工具,用来与Django进行交互
- __init__.py python包文件
- settings.py 配置文件
- urls.py 路由分发,定义了url访问路径与视图函数的映射关系
- wsgi.py 网关文件,部署服务器用
Django内建了一个轻量级web服务器,仅供开发使用。它同一时间只能处理一次请求,且没有安全审计。因此在生成环境中,还是要部署Apache或Nginx这类专业的web服务器。
现在我们在终端通过命令来启动这个开发服务器:
python manage.py runserver [ip] [port]
如果不指定ip和端口,默认运行在本机的8000端口。通过浏览器访问http://127.0.0.1:8000/时,将看到一个默认页面。那是因为我们还没有创建任何应用并设置路由。下面我们就为这个项目创建一个应用。

2 创建应用

切换到到项目的根目录下,输入如下命令:
python manage.py startapp app_name
这里,我创建一个名为blog的应用。项目根目录下将生成一个以blog命名的新目录。我们在该目录下手动新建一个templates文件夹,用来存放html模板。

打开全局文件夹myweb下的setting.py,将新创建的blog应用添加到INSTALLED_APPS中。Django在寻找应用模板,及执行数据库迁移等操作,都要以这步为前提:

3 定义视图函数

views.py中的定义的函数是实现应用的具体业务逻辑,这些函数统称为视图函数。现在我们来定义一个视图函数,用它来返回首页内容。并在template文件夹下建立一个index.html文件,编辑内容<h1>Welcome to index page!</h1>

from django.shortcuts import renderdef index(request):"""该视图函数用来返回首页的内容:param request: 请求对象:return: 返回由render函数渲染的html模板并返回的http响应"""return render(request, 'index.html')

4 url映射

我们知道用户通过url访问网站,不同的url应该调用不同的视图函数,这样才能正确处理用户的请求,并返回响应内容。现在我们为刚刚定义的index视图函数添加url映射关系。
修改myweb文件夹下的urls.py文件,添加url与映射。

from django.conf.urls import url
from django.contrib import admin
from blog import views as blog_views
# 从blog应用中导入视图函数urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/$', blog_views.index),# 添加映射,当用户的url路径是index/时,调用blog应用中的index视图函数
]

这里简单说下一个url的构成:

5 启动服务

python manage.py runserver [ip] [port] 比如:python manage.py runserver 192.168.16.2:8000 。注意访问时可能会提示DisallowedHost,解决方案:编辑项目settings.py 中的ALLOWED_HOSTS = ['*']即可。
我们在创建项目时已经启动了服务,Django会检测代码更改并自动重启服务。如果有必要,可以ctl + c退出,然后重启服务。现在我们试着访问http://127.0.0.1/index,将看到首页:

Django(一)预热相关推荐

  1. django 热启动_传统的Web框架如何部署在Serverless架构上(以Flask为例)

    前言 Serverless架构是一个新的概念,也可以说是一个新的架构或者技术,但是无论他有多新,都不能一下子完成现有都开发习惯到Serverless架构的过渡,让现有的工程师放弃现有的Express. ...

  2. django实现,微博第三方登录超详细

    登录流程 前端获取认证code 在Vue页面加载时动态发送请求获取微博授权url django收到请求的url后,通过微博应用ID(client_id)和回调地址(redirect_uri)动态生成授 ...

  3. Django学习之路(一)--初识django

    1.先创建虚拟环境 为什么要创建虚拟环境呢? 你有两个项目同时进行,一个需要pytnon3.9和Django3.x版本的,一个需要python3.7和Django2.x版本的,不进行环境隔离的话,运行 ...

  4. django自带的分页功能

    django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...

  5. django正反向查询

    django正反向查询 当我们的表存在外键想要从一找多的时候该怎么查找,当我们从多找一的时候又应该怎么查找. 一找多 首先我们要创建一个项目,在项目的model.py中创建两个模型. from dja ...

  6. 预热学习率的作用warmup

    学习率是神经网络训练中最重要的超参数之一,针对学习率的优化方式很多,Warmup是其中的一种 (一).什么是Warmup? Warmup是在ResNet论文中提到的一种学习率预热的方法,它在训练开始的 ...

  7. Django 布署6.5

    布署 从uwsgi.nginx.静态文件三个方面处理 服务器介绍 服务器:私有服务器.公有服务器 私有服务器:公司自己购买.自己维护,只布署自己的应用,可供公司内部或外网访问 公有服务器:集成好运营环 ...

  8. Django 全文检索6.3

    全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 haystack:django的一个包,可以方便地对model里面的内容进行索引.搜索,设计为支持wh ...

  9. Django 缓存6.2

    缓存 对于中等流量的网站来说,尽可能地减少开销是必要的.缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源 Django自带了一个健壮的缓存系统来保存动态页面,避免对 ...

最新文章

  1. [转]SQLObject加MySQL的 utf-8解决之道
  2. DiracNetV2
  3. git add .出现尚未暂存以备提交的变更
  4. mysql索引 聚集索引_Mysql 索引实现原理. 聚集索引, 非聚集索引
  5. 基于oracle设计与实现,基于Oracle的高校研究生招生系统设计与实现.doc
  6. mysql的binary、char、varchar区别
  7. 强化学习《基于策略价值 - Actor-Critic》
  8. linux定时任务执行脚本文件找不到,linux中脚本放入计划任务当中为什么没有执行呢?...
  9. 整理 .NET 平台下一些强大的开源控件和类库
  10. mysql性能优化方案总结
  11. 计算机组组内培训记录,计算机教研组活动记录
  12. Python 设计模式之建造者模式 Builder Pattern
  13. 2015最新Linkedin人才趋势报告
  14. 简述delete与delete[]的区别
  15. 微波工程(4)——阻抗匹配
  16. 基于串级pid控制系统的两轴无人机云台设计
  17. 1000以内完数c语言程序_求1000以内完数 c语言 。。
  18. 用于遥感图像语义分割和单视图高度估计的编码器-双解码器IGARSS2019
  19. 基于QT和DCMTK的Dicom 图像浏览器---收尾二
  20. 如何使用手机裁剪图片大小?

热门文章

  1. (软件工程复习核心重点)第七章软件维护-第三节:软件可维护性
  2. (王道408考研操作系统)第三章内存管理-第二节1:虚拟内存管理基本概念
  3. 938. 二叉搜索树的范围和
  4. Linux下安装Octave
  5. 应用程序无法正常启动(0xc000007b)错误的解决
  6. Java 集合List、Set、HashMap操作一(Array转List、Set排序、HashMap遍历、Set遍历、List遍历、HashMap大小长度、List打乱顺序)
  7. Linux下编译运行Go程序
  8. XML相关的安全漏洞-XXE,XPATH小结(XXE注入、XPATH注入)
  9. docker 搭建 ftp服务器
  10. Linux C DNS 查询IP地址