第十二章 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. LeetCode 787. Cheapest Flights Within K Stops

    原题链接在这里:https://leetcode.com/problems/cheapest-flights-within-k-stops/ 题目: There are n cities connec ...

  2. win7虚拟机安装

    https://blog.csdn.net/qq_16503045/article/details/81904986 iso下载地址 https://msdn.itellyou.cn/

  3. 加密hashlib模块

    目录 hashlib和hmac模块: hashlib模块: -hash: 特点: 大致流程: 注意: hmac模块: 特点: 注意:hmac模块只接受二进制数据的加密 hashlib和hmac模块: ...

  4. GoCN每日新闻(2019-10-04)

    GoCN每日新闻(2019-10-04) 国庆专辑:GopherChina祝大家国庆节快乐 GoCN每日新闻(2019-10-04) 1. Go提议流程:代表 https://research.swt ...

  5. bash 重启后台程序脚本

    kill -9 `cat pid` nohup python3 -u webserver.py & echo $! > pid

  6. 《精通CSS第3版》(3)可见格式化模型+(4)网页排版

  7. 运维笔记--linux环境提示python: command not found

    场景描述: 新部署的容器环境,终端执行python命令,提示没有该命令. 从报错异常可以看出,可能是python环境未安装. 分析思路: 检查python路径: 方式一:type -a python ...

  8. Oracle系列十二 约束

    约束是表级的强制规定有以下五种约束: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK 注意事项 如果不指定约束名 ,Oracle server 自动按照 S ...

  9. Python3基础 函数 函数名赋值操作

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  10. sqlserver表被锁了,解锁方法,删除锁的方法

    -- 查询死锁select        request_session_id spid,       OBJECT_NAME(resource_associated_entity_id) table ...