框架与架构

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类似,支持过滤器。

五、WEB框架基础(1)的更多相关文章

  1. 五、Web框架基础(2)

    Tornado 异步协程编程.(其实是异步IO而非真正的异步,从内核拷贝到用户空间的过程还是同步的) 适合用户量大.高并发,如抢票.网页游戏.在线聊天等场景:或大量HTTP持久连接,通过单TCP持久连 ...

  2. Python-S9-Day115——Flask Web框架基础

    01 今日内容概要 02 内容回顾 03 Flask框架:配置文件导入原理 04 Flask框架:配置文件使用 05 Flask框架:路由系统 06 Flask框架:请求和响应相关 07 示例:学生管 ...

  3. python 学习笔记十五 web框架

    python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...

  4. 五. web开发基础

    一.HTML 二.CSS 三.JavaScript 四.web框架 1.web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 ...

  5. WEB框架概述(译)

    在学习WEB框架之前,我个人觉得需要搞清楚一件事:什么是WEB框架?在网上找了很多资料,觉得什么是WEB框架这篇文章讲的比较全面而清晰,本文作者Jeff Knupp. 全文如下: Web 应用框架,或 ...

  6. 【译】什么是 web 框架?

    Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式.从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的.我发现很多人都热衷于学习 w ...

  7. WEB框架-Django框架学习-预备知识

    今日份整理,终于开始整个阶段学习的后期了,今日开始学习Django的框架,加油,你是最胖的! 1.web基础知识 1.1 web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是 ...

  8. Python开发【第十五篇】:Web框架之Tornado

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  9. Python开发【第十八篇】Web框架之Django【基础篇】

    一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...

随机推荐

  1. Java面试题之Java中==和equals()和hashCode()的区别

    “==”: ==是运算符,用来比较两个值.两个对象的内存地址是否相等: “equals()”: equals是Object类的方法,默认情况下比较两个对象是否是同一个对象,内部实现是通过“==”来实现 ...

  2. Linux System Programming 学习笔记(八) 文件和目录管理

    1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...

  3. poj 6243 Dogs and Cages

    Dogs and Cages Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  4. P1340 送礼物

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了. ...

  5. 系统软键盘">Android在外接物理键盘时,如何强制调用系统软键盘?

    第一次写,写的不好请见谅 物理键盘映射过程: 手机/system/usr/keylayout/*.kl :内核将keyCode映射成有含义的字符串KeycodeLabels.h : framework ...

  6. Day 18 函数之一

    函数参数: 1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元.因此,形参只在函数内部有效.函数调用结束返回主调用函数后则不能再使用该形参变量 2.实参可以是常量.变量. ...

  7. Wannafly挑战赛2 D.Delete(拓扑排序 + dij预处理 + 线段树维护最小值)

    题目链接  D.Delete 考虑到原图是个DAG,于是我们可以求出每个点的拓扑序. 然后预处理出起点到每个点的最短路$ds[u]$, 和所有边反向之后从终点出发到每个点的最短路$dt[u]$. 令点 ...

  8. F#周报2019年第21期

    新闻 F#在GitHub上的开发仓库现在变为dotnet/fsharp Ionide 4.0路线图 Fable的五月公告 Visual Studio 2019版本16.1 WinUI 3.0路线图 欢 ...

  9. git使用笔记一:

    Get code into Bitbucket fast using the command line Set up your local directory Set up Git on your m ...

  10. 支持C++11标准

    设置CB下的GCC. Settings->Compiler->Compiler Settings勾选Have g++ follow the C++11 ISO C++ language s ...