Django(一)预热
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(一)预热相关推荐
- django 热启动_传统的Web框架如何部署在Serverless架构上(以Flask为例)
前言 Serverless架构是一个新的概念,也可以说是一个新的架构或者技术,但是无论他有多新,都不能一下子完成现有都开发习惯到Serverless架构的过渡,让现有的工程师放弃现有的Express. ...
- django实现,微博第三方登录超详细
登录流程 前端获取认证code 在Vue页面加载时动态发送请求获取微博授权url django收到请求的url后,通过微博应用ID(client_id)和回调地址(redirect_uri)动态生成授 ...
- Django学习之路(一)--初识django
1.先创建虚拟环境 为什么要创建虚拟环境呢? 你有两个项目同时进行,一个需要pytnon3.9和Django3.x版本的,一个需要python3.7和Django2.x版本的,不进行环境隔离的话,运行 ...
- django自带的分页功能
django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...
- django正反向查询
django正反向查询 当我们的表存在外键想要从一找多的时候该怎么查找,当我们从多找一的时候又应该怎么查找. 一找多 首先我们要创建一个项目,在项目的model.py中创建两个模型. from dja ...
- 预热学习率的作用warmup
学习率是神经网络训练中最重要的超参数之一,针对学习率的优化方式很多,Warmup是其中的一种 (一).什么是Warmup? Warmup是在ResNet论文中提到的一种学习率预热的方法,它在训练开始的 ...
- Django 布署6.5
布署 从uwsgi.nginx.静态文件三个方面处理 服务器介绍 服务器:私有服务器.公有服务器 私有服务器:公司自己购买.自己维护,只布署自己的应用,可供公司内部或外网访问 公有服务器:集成好运营环 ...
- Django 全文检索6.3
全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 haystack:django的一个包,可以方便地对model里面的内容进行索引.搜索,设计为支持wh ...
- Django 缓存6.2
缓存 对于中等流量的网站来说,尽可能地减少开销是必要的.缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源 Django自带了一个健壮的缓存系统来保存动态页面,避免对 ...
最新文章
- [转]SQLObject加MySQL的 utf-8解决之道
- DiracNetV2
- git add .出现尚未暂存以备提交的变更
- mysql索引 聚集索引_Mysql 索引实现原理. 聚集索引, 非聚集索引
- 基于oracle设计与实现,基于Oracle的高校研究生招生系统设计与实现.doc
- mysql的binary、char、varchar区别
- 强化学习《基于策略价值 - Actor-Critic》
- linux定时任务执行脚本文件找不到,linux中脚本放入计划任务当中为什么没有执行呢?...
- 整理 .NET 平台下一些强大的开源控件和类库
- mysql性能优化方案总结
- 计算机组组内培训记录,计算机教研组活动记录
- Python 设计模式之建造者模式 Builder Pattern
- 2015最新Linkedin人才趋势报告
- 简述delete与delete[]的区别
- 微波工程(4)——阻抗匹配
- 基于串级pid控制系统的两轴无人机云台设计
- 1000以内完数c语言程序_求1000以内完数 c语言 。。
- 用于遥感图像语义分割和单视图高度估计的编码器-双解码器IGARSS2019
- 基于QT和DCMTK的Dicom 图像浏览器---收尾二
- 如何使用手机裁剪图片大小?
热门文章
- (软件工程复习核心重点)第七章软件维护-第三节:软件可维护性
- (王道408考研操作系统)第三章内存管理-第二节1:虚拟内存管理基本概念
- 938. 二叉搜索树的范围和
- Linux下安装Octave
- 应用程序无法正常启动(0xc000007b)错误的解决
- Java 集合List、Set、HashMap操作一(Array转List、Set排序、HashMap遍历、Set遍历、List遍历、HashMap大小长度、List打乱顺序)
- Linux下编译运行Go程序
- XML相关的安全漏洞-XXE,XPATH小结(XXE注入、XPATH注入)
- docker 搭建 ftp服务器
- Linux C DNS 查询IP地址