python框架Django与WSGI

今天学习了一下用简单的Django框架与简单的WSGI服务器配套运行一个简单的Django项目;

Django不是完整的web后端框架,它需要和一个WSGI服务器配套,由WSGI服务器负责网络通讯部分。

1.Django与WSGI

WSGI全称:Web Server Gateway Interface,是Python定义的WSGI程序和WSGI服务器之间的一种接口

现一个WSGI应用,只需要满足3个要求:

  1. 是可调用的,比如是一个函数,或者是一个可调用类(具有__call__方法)的实例
  2. WSGI应用应当返回一个可迭代(iterable)的值,比如字符串列表
  3. WSGI应用在返回之前,应当调用WSGI服务器传入的start_response函数发送状态码和HTTP报文头

一种最简单的满足WSGI规约的应用程序需要实现一个指定形式的函数:

from wsgiref.simple_server import make_server

def wsgi_app(environ,start_response):
    from  pprint import pprint
    pprint(environ)
    start_response(‘200 OK‘,[(‘Context-Type‘,‘text/plain‘)])
    return ‘such a tiny wsgi app!‘

httpd = make_server(‘0.0.0.0‘,80,wsgi_app)
print ‘start server‘
httpd.serve_forever() 

environ是一个包含全部HTTP请求信息的字典/Dict,由WSGI服务器解包HTTP请求生成。

2.创建WSGI应用对象

Django框架对一个WSGI应用的结构进行了分解,有些部件由框架完成,有些部分需要 开发者实现。因此,开发一个基于Django框架的Web应用,事实上就是填充Django框架 所约定的需要由开发者完成的部件。

根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图。Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理:

Django框架严重依赖于一个全局配置对象settings来定制 其行为,因此,我们需要在创建WSGI应用对象之前,首先使用默认值初始化这个全局 配置对象

from django.conf import settings;#配置对象
from django.core.wsgi import get_wsgi_application;  #创建WSGI应用对象

settings.configure()
settings.DEBUG = True
#配置对象

wsgi_app = get_wsgi_application();  #创建WSGI应用对象

print wsgi_app

3.编写视图函数

输入 :第一个参数是一个HttpRequest对象,这是Django框架对一个HTTP请求 的完整封装,视图函数从这个对象中提取请求中的信息

输出 :返回值应当是一个HttpResponse对象,Django框架将基于这个返回 的对象完成对WSGI服务器的响应

from django.conf import settings
from django.core.wsgi import get_wsgi_application
from django.http import HttpRequest,HttpResponse

settings.configure()
settings.DEBUG = True

wsgi_app = get_wsgi_application()

#一个简单的视图函数
def v_index(request):
    return HttpResponse(‘Hello,Djando!‘)

#模仿框架构造一个HttpRequest对象,传给视图函数
req = HttpRequest();
print v_index(req)

4.定义路由表

Django框架根据HTTP请求的URL来找到对应的视图函数,很自然的,路由表 使用一个列表对象,其中每一项记录一种URL模式与一个视图函数的对应关系;

url()函数用来生成一个路由项,第一个参数是一个正则表达式,用来匹配 HTTP请求的URL,前缀r用来防止正则字符串被转义;第二个参数就是我们定义 的视图函数。

注册路由:

在一个有点规模的应用中,可能会存在多个开发组,每个开发组维护单独的一张路由表。 因此,在Django框架中,需要告诉Django框架使用那个路由表作为根路由表。

使用全局配置对象的ROOT_URLCONF属性来注册根路由表,应当为这个属性指定一个 具有urlpatterns变量的模块名,Django将动态导入这个模块并使用其urlpatterns 变量的值作为路由表。

因此,通常情况下,总应该将路由表变量命名为urlpatterns。

import sys
from django.conf import settings
from django.core.wsgi import get_wsgi_application
from django.http import HttpRequest,HttpResponse
from django.conf.urls import url

settings.configure()
settings.DEBUG = True

wsgi_app = get_wsgi_application()

def v_index(request):
    return HttpResponse(‘Hello,Djando!‘)

urlpatterns = [
    url(r‘^$‘,v_index),
]
settings.ROOT_URLCONF = sys.modules[__name__]
print urlpatterns

5.对接简单WSGI服务器

使用python自带的简单WSGI服务器:

from wsgiref.simple_server import make_server
httpd = make_server(‘0.0.0.0‘,80,wsgi_app)#全地址0.0.0.0;端口号80
httpd.serve_forever()

6.最后生成一个用Django实现WSGI应用程序

# -*- coding:utf-8 -*-
import sys
from django.conf import settings
from django.core.wsgi import get_wsgi_application
from django.http import HttpRequest,HttpResponse
from django.conf.urls import url
from wsgiref.simple_server import make_server

settings.configure()
settings.DEBUG = True

wsgi_app = get_wsgi_application()

def v_index(request):
    return HttpResponse(‘Hello,Djando!‘)

urlpatterns = [
    url(r‘^$‘,v_index),#r为防止正则字符串被转义,‘^$‘中Django框架在使用定义的路由表之前,已经吃掉了$符前的那个前缀的/
]
settings.ROOT_URLCONF = sys.modules[__name__]

httpd = make_server(‘0.0.0.0‘,80,wsgi_app)
print ‘starting server...‘
httpd.serve_forever()
时间: 2024-10-14 04:57:42

python框架Django与WSGI的相关文章

python框架Django的下载安装及使用框架创建的第一个项目

如果还未下载Django,可以使用以下链接:https://www.djangoproject.com/download/ 下载安装解压Django压缩包后,将其压缩后的文件跟python安装目录放在同一个根目录,以下介绍两种方式安装: 进入 Django 目录,执行python setup.py install,开始安装,Django将要被安装到Python的Lib下site-packages: 打开cmd,使用已经配置好环境变量的python命令pip install Django安装,之后

python框架-Django创建项目

创建项目 django-admin startproject douban//创建project cd douban python manage.py startapp books//创建app项目 配置文件 在douban文件夹下 1.vim books/views.py//写入页面程序 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts import render # Cr

python框架django中结合vue进行前后端分离

一.创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应用  二.安装vue 安装vue-cli:npm install -g vue-cli (Vue-cli是Vue的脚手架工具,-g表示在全局下安装vue-cli) 安装webpack: npm install webpack -g  (包管理工具,主要是打包和解包用的) 创建项目:vue init

python框架-django中的表单类

一:表单类 一般我们在html中自己写的表单类似于下面的样子 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv=

Python进阶(三十六)-Web框架Django项目搭建全过程

Python进阶(三十六)-Web框架Django项目搭建全过程 ??IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 ??Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后台功能 几行简单的代码就让你的网

python web框架 django 工程 创建 目录介绍

# 创建Django工程django-admin startproject [工程名称] 默认创建django 项目都会自带这些东西 django setting 配置文件 django可以配置缓存 连接数据库 做静态文件处理 找模板 django url 用户访问django程序 会从自己规则做匹配 一旦匹配成功 返回用户数据 没有匹配上不返回 django wsgi python有个自带的wsgi模块 可以写自定义web框架 用wsgi在内部创建socket对象就可以了 自己只写处理函数就可

真正搞明白Python中Django和Flask框架的区别

在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用.系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后一块砖一块砖叠上去. 而开发一个应用呢?同样也需要一个好的架构设计,数据库建模,然后一个模块一个模块使用代码实现. 如果开发一个软件应用不使用框架,和我们建房子时,每一块砖.每一根钢筋都需要自己生产出来本质上是一样的. 显而易见,如果在

资源分享_Django.GitHub Python网页框架Django资源集合

模块相关: Channels 简介: Channels旨在增强Django的异步能力,同时让Django不仅仅局限于Request-Response模型,能够支持WebSocket,HTTP2推送和背景任务. Django-Baker 简介: Django Baker可以帮助开发者快速启动项目.只要提供app名称,Django Baker就可以根据models.py文件中的models,自动生成视图,表单,URL,admin页面以及模板. Django-Q 简介: Django Q是一个原生Dj

在Python的Django框架中加载模版的方法

在Python的Django框架中加载模版的方法 为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文件就是settings.py. 如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧. 它的默认设置是一个空元组(tuple),加上一些自动生成的注释. TEMPLATE_DIRS =