第十二章 Django框架

12.1 服务器程序和应用程序

服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uwsgi、Gunicorn,而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。

12.11 用wsgiref代替socket server

import time
from wsgiref.simple_server import make_server
def home(url): # 将返回不同的内容部分封装成函数
s = "this is {} page!".format(url)
return bytes(s, encoding="utf8")
def index(url):
return b'<h1>index page</h1>'
def user(url): # 不同的用户得到的页面上显示不同的时间
c_time = str(time.time())
with open("user.html", "r") as f:
data_s = f.read()
data_s = data_s.replace("@@xx@@", c_time)
return bytes(data_s, encoding="utf8")

url2func = [ # url和实际要执行的函数的对应关系
("/index/", index),
("/home/", home),
("/user/", user),]

def run_server(environ, start_response):# 按照wsgiref的要求定义一个run_server函数
start_response('200 OK',[('Content-Type','text/html;charset=utf8'),])#设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in url2func:
if url == i[0]:
func = i[1] # 拿到将要执行的函数
break
if func:
msg = func(url) # 执行对应的函数
else:
msg = b'<h1>404</h1>' # 找不到要执行的函数就返回404
return [msg, ] # 发送消息到客户端

if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("我在8090等你哦...")
httpd.serve_forever()

12.12 HTML模板渲染工具jinja2

user.html:

<body>
<table border="1">
<thead>
<tr>
<th>id</th>
<th>姓名</th>
<th>爱好</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.hobby}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>

使用jinjia2替换HTML中的数据:

使用pymysql模块查询数据库获取数据,使用jinjia2替换HTML中的数据

模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法规则,其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容

import time
from wsgiref.simple_server import make_server
from jinja2 import Template
import pymysql
def user(url):
conn = pymysql.connect( # 从数据库里面去到所有的用户信息,
host='127.0.0.1',
port=3306,
user='root',
password='',
database='db6',
charset='utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute('select * from user')
ret = cursor.fetchall()
#print(ret)
with open("user.html", "r", encoding="utf8") as f:
data_s = f.read()
template = Template(data_s) # 生成一个模板文件实例
msg = template.render({"user_list": ret}) # 把数据填充到模板里面
return bytes(msg, encoding="utf8") url2func = [ # url和将要执行的函数的对应关系
("/index/", index),
("/home/", home),
("/user/", user),]
def run_server(environ, start_response): # 按照wsgiref的要求定义一个run_server函数
start_response('200 OK',[('Content-Type','text/html;charset=utf8'),])#设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url

func = None
for i in url2func:
if url == i[0]:
func = i[1] # 拿到将要执行的函数
break
if func:
msg = func(url) # 执行对应的函数
else:
msg = b'<h1>404</h1>' # 找不到要执行的函数就返回404
return [msg, ] # 发送消息到客户端

if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("我在8090等你哦...")
httpd.serve_forever()

12.2 Django基础必备三件套

用命令创建了一个名为"mysite"的Django 项目

django-admin startproject mysite

Django目录:

mysite/
├── manage.py # 管理文件
└── mysite # 项目目录
├── __init__.py
├── settings.py # 配置
├── urls.py # 路由 --> URL和函数的对应关系
└── wsgi.py # runserver命令就使用wsgiref模块做简单的 web server

用命令运行Django项目

python3 manage.py runserver 127.0.0.1:8000 #默认使用8000端口

模板文件配置:settings

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "template")], # template文件夹位置
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

静态文件配置:settings

STATIC_URL = '/static/'               # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"), # 静态文件存放位置
]

12.21 HttpResponse

内部传入一个字符串参数,返回给浏览器

from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse, render, redirect
def index(request): #所有跟请求相关的数据都封装到了request这个参数里面
# 业务逻辑代码
return HttpResponse("这是index页面!")

12.22 render

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数,将数据填充进模板文件,最后把结果返回给浏览器(类似于上面用到的jinja2)

def login(request):
# 自己去找HTML文件
# with open("templates/login.html", "r", encoding="utf8") as f:
# data = f.read()
# return HttpResponse(data)
# Django去找login.html文件,读取出来内容,返回给浏览器
return render(request, "login.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})

12.23 redirect

接受一个URL参数,表示跳转到指定的URL

def index(request):
# 业务逻辑代码
return redirect("/home/")

12.24 设置URL和函数的对应关系

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', home),
url(r'^index/', index),
url(r'^login/', login),
]

python 之 Django框架(服务器程序和应用程序、基础必备三件套及相关配置)的更多相关文章

  1. Python的Django框架中的Context使用

    Python的Django框架中的Context使用 近期整理些Python方面的知识,一旦你创建一个 Template 对象,你能够用 context 来传递数据给它. 一个context是一系列变 ...

  2. 将Python的Django框架与认证系统整合的方法

    将Python的Django框架与认证系统整合的方法 这篇文章主要介绍了将Python的Django框架与认证系统整合的方法,包括指定认证后台和编写认证后台等内容,需要的朋友可以参考下 将Django ...

  3. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  4. Python的Django框架中的Cookie相关处理

    Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...

  5. 如何使用Python的Django框架创建自己的网站

    如何使用Python的Django框架创建自己的网站 Django建站主要分四步:1.创建Django项目,2.将网页模板移植到Django项目中,3.数据交互,4.数据库 1创建Django项目 本 ...

  6. Python的Django框架中的URL配置与松耦合

    Python的Django框架中的URL配置与松耦合 用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比 ...

  7. Django框架学习——python模拟Django框架(转载)

    原贴来源 http://wiki.woodpecker.org.cn/moin/ObpLovelyPython/AbtWebModules python实现web服务器 web开发首先要有web服务器 ...

  8. 051.Python的Django框架简单使用

    一 HTTP相关概念 http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的响应协议.用于HTTP协议交互的信息被为HTTP报文.请求端(客户端)的HTTP报文 ...

  9. python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)

    12.33 Django框架简介: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器( ...

随机推荐

  1. vue 项目的文件/文件夹上传下载

    前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践. ...

  2. git log filter(六)

    显示前10条提交记录: root@vmuer-VirtualBox:/media/vmuer/share/cmake-uart-server# git log -10 commit b056dacb0 ...

  3. C++ EH Exception(0xe06d7363)----抛出过程

    C++ EH Exception是Windows系统VC++里对c++语言的throw的分类和定义,它的代码就是0xe06d7363.在VC++里其本质也是SEH结构化异常机制.在我们分析用户崩溃的例 ...

  4. SVN 常用 查看日志

    1.日志查看,有时候会遇到查看一下之前改过的代码,或者恢复某某某个版本,这时就需要用到SVN的查看日志功能了,如图 2.日志列表,这里能看到各个版本的所有信息,包含了版本号 提交人 提交时间 提交时所 ...

  5. 【JZOJ6226】【20190618】纳什均衡

    题目 一颗二叉树,每个点儿子个数为0 或 2 ,对每个叶子有一个权值\((c(u),d(u))\) 从根结点开始走,Alice 可以选择奇数层的走法,Bob 可以选择偶数层的走法,分别获得最后走到叶子 ...

  6. nRF51822 配置超过4个的 按键驱动

    最近一个用到超过4个按键驱动,PCA10028 的板子上只有4个,所以SDK9 的pca10028.h 的宏只定义了4 #define BUTTONS_NUMBER 4 但是我要用超过4个的时候,就不 ...

  7. EasyEarth三维可视化解决方案——智慧园区

    智慧园区 智慧园区围绕“园区行为数据化”和“园区数据可视化”的核心理念,依托EasyEarth三维可视化基础地理信息云平台,综合运用云计算.物联网.自动化控制.现代通讯.图像识别.软硬件集成等技术,借 ...

  8. vue+elementui搭建后台管理界面(6登录和菜单权限控制[二])

    根据权限计算路由的代码 /** * 通过meta.role判断是否与当前用户权限匹配 * @param roles * @param route */ function hasRoles (roles ...

  9. mysql事务回滚机制概述

    应用场景:   银行取钱,从ATM机取钱,分为以下几个步骤       1 登陆ATM机,输入密码:    2 连接数据库,验证密码:    3 验证成功,获得用户信息,比如存款余额等:    4 用 ...

  10. .sql文件l通过PLSQL导入到Oracle数据库

    最近从第三方共享到一个数据,对方提供的是.sql文件.如何导入Oracle数据库? 开始想通过navicat for mysql工具--运行SQL文件来导入表---总是出现错误,失败. 后来还是用回P ...