Django框架(一)-Django初识
Django初识
一、Web框架本质—自己实现Web框架
1、所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8888))
sk.listen()
while True:
conn, addr = sk.accept()
data = conn.recv(8192)
conn.send(b'OK')
conn.close()
2、增加HTTP协议响应头
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8888))
sk.listen()
while True:
conn, addr = sk.accept()
data = conn.recv(8192)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
conn.send(b'OK')
conn.close()
3、根据用户请求不同的URL返回不同的内容
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8888))
sk.listen()
# 将不同的页面封装成不同的函数
def index(url):
page = "这是 {} 页面!".format(url)
return bytes(page, encoding="utf8")
def home(url):
page = "这是 {} 页面!".format(url)
return bytes(page, encoding="utf8")
while True:
conn, addr = sk.accept()
data = conn.recv(8192)
# 根据接收用户的信息获取url路径
data = str(data, encoding='utf-8')
data1 = data.split("\r\n")[0]
url = data1.split()[1]
# 根据不同的路径返回不同内容
if url == "/index/":
response = index(url)
elif url == "/home/":
response = home(url)
else:
response = b"404 NOT FOUND"
# 给客户端发送数据
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')
conn.send(response)
conn.close()
4、用反射优化请求不同URL返回不同内容
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8888))
sk.listen()
# 将不同的页面封装成不同的函数
def index(url):
page = "这是 {} 页面!".format(url)
return bytes(page, encoding="utf8")
def home(url):
page = "这是 {} 页面!".format(url)
return bytes(page, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
url_list = [
("/index/", index),
("/home/", home),
]
while True:
conn, addr = sk.accept()
data = conn.recv(8192)
# 根据接收用户的信息获取url路径
data = str(data, encoding="utf-8")
data1 = data.split("\r\n")[0]
url = data1.split()[1]
# 根据不同的路径返回不同内容
func = None
for i in url_list:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 NOT FOUND"
# 给客户端发送数据
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')
conn.send(response)
conn.close()
5、返回完整的静态HTML
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8888))
sk.listen()
# 将不同的页面封装成不同的函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
url_list = [
("/index/", index),
("/home/", home),
]
while True:
conn, addr = sk.accept()
data = conn.recv(8192)
# 根据接收用户的信息获取url路径
data = str(data, encoding="utf-8")
data1 = data.split("\r\n")[0]
url = data1.split()[1]
# 根据不同的路径返回不同内容
func = None
for i in url_list:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 NOT FOUND"
# 给客户端发送数据
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')
conn.send(response)
conn.close()
6、返回动态的HTML,本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据;模板渲染有个现成的工具:jinja2
import time
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8888))
sk.listen()
# 将不同的页面封装成不同的函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.asctime(time.localtime(time.time())))
s = s.replace("@@oo@@", now)
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
url_list = [
("/index/", index),
("/home/", home),
]
while True:
conn, addr = sk.accept()
data = conn.recv(8192)
# 根据接收用户的信息获取url路径
data = str(data, encoding="utf-8")
data1 = data.split("\r\n")[0]
url = data1.split()[1]
# 根据不同的路径返回不同内容
func = None
for i in url_list:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 NOT FOUND"
# 给客户端发送数据
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')
conn.send(response)
conn.close()
7、返回动态的HTML,wsgiref版
import time
from wsgiref.simple_server import make_server
# 将不同的页面封装成不同的函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.asctime(time.localtime(time.time())))
s = s.replace("@@oo@@", now)
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
url_list = [
("/index/", index),
("/home/", home),
]
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
# 根据不同的路径返回不同内容
func = None
for i in url_list:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 NOT FOUND"
return [response, ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8888, run_server)
print("Serving HTTP on port 8888...")
httpd.serve_forever()
8、返回动态的HTML,wsgiref + jinja2 版
import time
import jinja2
from wsgiref.simple_server import make_server
# 将不同的页面封装成不同的函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.asctime(time.localtime(time.time())))
s = s.replace("@@oo@@", now)
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
def person(url):
with open("person.html", "r", encoding="utf8") as f:
s = f.read()
# 生成一个jinja2的Template(模板)对象
template = jinja2.Template(s)
data = {"name": "Yang", "hobby_list": ["爱好1", "爱好2", "爱好3"]}
# 本质上是完成了字符串的替换
response = template.render(data)
return bytes(response, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
url_list = [
("/index/", index),
("/home/", home),
("/person/", person),
]
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
# 根据不同的路径返回不同内容
func = None
for i in url_list:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 NOT FOUND"
return [response, ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8888, run_server)
print("Serving HTTP on port 8888...")
httpd.serve_forever()
9、使用pymysql连接数据库
import time
import jinja2
import pymysql
from wsgiref.simple_server import make_server
# 将不同的页面封装成不同的函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.asctime(time.localtime(time.time())))
s = s.replace("@@oo@@", now)
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
def person(url):
with open("person.html", "r", encoding="utf8") as f:
s = f.read()
# 生成一个jinja2的Template(模板)对象
template = jinja2.Template(s)
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
passwd="",
db="userinfo",
charset="utf8"
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("SELECT name, hobby FROM user")
user = cursor.fetchone()
cursor.close()
conn.close()
hobby_list = user["hobby"].split()
user["hobby_list"] = hobby_list
# 本质上是完成了字符串的替换
response = template.render(user)
return bytes(response, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
url_list = [
("/index/", index),
("/home/", home),
("/person/", person),
]
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
# 根据不同的路径返回不同内容
func = None
for i in url_list:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 NOT FOUND"
return [response, ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8888, run_server)
print("Serving HTTP on port 8888...")
httpd.serve_forever()
二、Django初识
1、下载&安装
①建议安装最新LTS版
②pip3 install django==1.11.11
2、创建项目
①创建一个名为mysite的Django项目 django-admin startproject mysite
或者pycharm新建一个Django项目

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

4、运行操作 & 模板文件配置 & 静态文件配置
①运行Django项目: python manage.py runserver 127.0.0.1:8000
或者直接用pycharm的运行

②模板文件配置
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里面的tempaltes里面修改dirs路径

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

另外需要新建一个static文件夹存放css等文件:

④刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

5、Django基础必备三件套介绍
- from django.shortcuts import HttpResponse, render, redirect
①HttpResponse
- 介绍
内部传入一个字符串参数,返回给浏览器 - 示例
def index(request):
# 业务逻辑代码
return HttpResponse("OK")

②render
- 介绍
除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2) - 示例
def index(request):
# 业务逻辑代码
return render(request, "index.html", {"name": "yang", "hobby": ["hobby_1", "hobby_2"]})
③redirect
- 介绍
接受一个URL参数,表示跳转到指定的URL - 示例
def index(request):
# 业务逻辑代码
return redirect("/home/")
最后:



Django框架(一)-Django初识的更多相关文章
- Django框架02 /Django下载安装、url路由分发
Django框架02 /Django下载安装.url路由分发 目录 Django框架02 /Django下载安装.url路由分发 1. django下载安装 2. pycharm创建项目 3. 基于D ...
- Django框架 (七) Django ORM模型
ORM简介 查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装
- 3/18 Django框架 启动django服务
web框架:本质是socket服务端,socket通常也被称为"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信.web框架就是将 ...
- django框架基础-django redis-长期维护-20191220
############### django框架-django redis ############### # 学习django redis我能得到什么? # 1,项目中广泛使用到redis ...
- Django框架(九) Django之ORM常用字段和参数
ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范 ...
- Django框架(六) Django之模板继承
模版导入和继承 模版导入 一个页面只能继承一个模板,如何解决了?如何使用多个模板,或者引入其他页面 <% include "a.html" %> 可以引用多次 模板,i ...
- Django框架(八) Django之ORM数据库操作
创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...
- Django框架(十) Django之模型进阶
QuerySet对象 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. Entry.objects.all()[:5] # (LIMI ...
- Django框架(四) Django之视图层
视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . ...
随机推荐
- CSS基础之选择器
一:CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到,一个样式表时,就会按照. 二:CSS语法 每个CSS有两部分组成:选择器和声明 ...
- Java枚举类型的用法
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...
- 使用solrJ管理索引——(十四)
a) 什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
- [MySQL FAQ]系列 — EXPLAIN结果中哪些信息要引起关注
我们使用EXPLAIN解析SQL执行计划时,如果有下面几种情况,就需要特别关注下了: 首先看下 type 这列的结果,如果有类型是 ALL 时,表示预计会进行全表扫描(full table scan) ...
- Linux下编译安装qemu和libvirt【转】
转自:http://www.cnblogs.com/findumars/p/5679742.html 目录 [hide] 1 安装qemu 1.1 qemu介绍 1.2 下载源文件 1.3 编译安装 ...
- 手动实现图片预览-放大缩小全屏支持IE9以上
#{extends '/Index/index.html' /} #{set title:'意见反馈' /} <script src="/public/mgr/javascripts/ ...
- Javascript中的Callback方法浅析
什么是callback? 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数 ...
- wordcount在本地运行报错解决:Exception in thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.native.NativeID$Windows.access
在windows中的intellij中运行wordcount程序,控制台输出以下报错 在Intellij编辑器中解决办法:本地重新创建NativeIO类,修改一个方法返回值,然后用新建的NativeI ...
- RabbitMQ--Publish/Subscribe(三)
前言 在先前例子中我们创建了一个work queue,封装一个task到一个message中并发送到queue.一个worker(consumer)取出任务并执行. 像这种producer把messa ...
- Centos之其他帮助命令
选项帮助 命令 -help 获取命令选项的帮助 例如 ls --help 我们会发现用这种方式查看帮助命令 居然还有中文解释: 详细命令帮助info info 命令 -回车:进入子帮助页面(带有*号标 ...