五、WEB框架基础(1)
框架与架构
Python语言有很多web框架,主要是四个,企业级框架Django,高并发处理框架Tornado,快速开发框架Flask,自定义协议框架Twisted。
全栈网络框架封装了网络通信/线程、HTTP栈、数据库读写、HTML模板等功能,但是Twisted框架专注网络底层协议开发,不提供模板引擎,因此Twisted并不算是全栈框架。
Django功能强大完全,但封闭。
Tornado异步协程高并发。
Flask小而精。
Twisted事件驱动框架。
架构
早期的网络服务器提供的都是静态资源,但随着网络技术的发展,动态资源逐渐占据主流,而针对动态资源的生成与用户输入的关系,出现了很多设计架构。
通用架构MVC,即模型层、视图层、控制层,MVC架构+数据库就是我们统称的Web应用。
用户接收View,用户输入传到Controller中,而数据经Controller封装分发到对应路由也就是Model层进行进一步处理。
Web服务器
框架在Web开发中,属于后端应用,而后端由服务器,应用,数据库这三大部分组成。
WSGI接口
这个接口本身也是一个服务器,相当于为应用设置了监听IP与端口,但它是对应用的封装,使得Web服务器可以直接调用这个接口来连接后端应用,而不是针对不同的后端应用开发不同的接口,总而言之就是统一了规范。
WSGI相当于连接Web服务器与服务器应用,其中Web服务器与WSGI连接的接口又有uwsgi和fastcgi之分,不过常用的还是uwsgi(是WSGI在Linux下的实现)。
WSGI本身也可作为服务器运行,但性能较差,一般作测试用。
服务器
常见的Web服务器有Nginx、Tomcat、Apache,但Nginx是python在Linux下首选的服务器之一。
所以结合WSGI接口,常规的Web服务器组成为Linux、Nginx、uwsgi。
Django框架
Django框架主要分为模型层、视图层、表单、管理站点。
细分为管理工具、Model、View、Template、Form、Admin。
管理工具
# 创建项目
django-admin startproject [project]
# 创建应用
django-admin startapp [app]
项目创建后,生成一个项目名包和一个单独的manage.py文件,此文件是管理项目的工具,项目名包中包含配置文件、路由映射、wsgi接口。
应用创建后,生成迁移包和admin管理声明文件、apps应用信息定义文件、models模型层文件、views视图层文件、tests测试文件。
views视图层
views.py就是MVC中的View层,负责进一步处理数据+生成页面数据。
# 渲染页面
from django.http import HttpResponse
from django.template import loader
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
# 改进的渲染页面
from django.shortcuts import render
return render(request, 'polls/index.html', context)
# 更进一步的改进
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self): # 重载该方法,用于提供模板需要的对象
return Question.objects.order_by('-pub_date')[:5]
# 重定向页面
from django.http import HttpResponseRedirect
from django.urls import reverse
return HttpResponseRedirect(reverse('polls:results', args=(question_id,)))
models模型层
通过ORM建立表模型,对View层提供访问数据库的功能,所有对数据库数据的操作都在这一层完成。
没有自动创建的文件的Controller控制层
urls.py,用于将请求分发到指定的views路由函数中,属于Controller层,但在Django中没有指定Controller的文件。
对于app的urls,使用直接映射;对于project的urls,使用分布式映射(include)。
from django.conf.urls import url
from . import views
app_name = 'polls'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), # 这一行就是直接映射,前三行是规范化后的直接映射
]
forms.py,用于对Form表单建立对应类,由views进行引用,也属于Controller层的定义。
admin管理层
这个是便于数据管理,基本每个框架都提供该功能,不在MVC架构范围内。
将之前models层建立的模型导入到admin.py文件中,调用admin.site.register()
方法注册,即可用于管理。
管理页面为domain/admin,建立管理员用户账号使用python manage.py createsuperuser
命令。
模板
属于视图层,语法与jinja2类似,支持过滤器。
最新文章
- awk神器
- 无法删除对象 &#39;产品&#39;,因为该对象正由一个 FOREIGN KEY 约束引用。
- 拾取模型的原理及其在THREE.JS中的代码实现
- 0506--Scrum项目1.0
- Java-maven异常-cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突
- 【结构型】Adapter模式
- 转摘--如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
- 如何在一个jpg图片上面叠加文字
- n每个计数的概率和发生骰子--动态规划
- oc汉子转拼音
- POJ - 2336 Wireless Network
- 正则表达式过滤HTML、JS、CSS
- 微信小程序中样式问题
- VBA批量导入图片到多Word文档并加标题(会飞的鱼)
- 从零开始一起学习SLAM | 掌握g2o顶点编程套路
- 用Python实现一个词频统计(词云+图)
- 搭建iview环境
- Docker 容器备份例子
- 个人作业Week2-代码复审(修改明确了要求)
- git 新建本地分支后将本地分支推送到远程库, 使用git pull 或者 git push 的时候报错