Django

web框架本质

浏览器把你输入的网址,做成请求(请求头),如果是域名,通过dns解析服务器解析出对方服务器地址,然后把请求通过socket发送到对方地址,对方服务器socket接收到请求,查询相应的文件,返回结果(成功 200)并把文件返回到发送端的socket,然后呈现到浏览器比如:

http://www.jd.com/245165220002.html

www.jd.com 是服务器域名,会被dns解析成ip地址

245165220002.html才是真正要请求的路径文件

一个web服务器的简单例子

Title

hello world

#python server文件,

import socket

sc = socket.socket()

sc.bind(('127.0.0.1',8080))

sc.listen()

while 1:

conn,addr = sc.accept()

data = conn.recv(1024) #接收请求头

print(data.decode('utf-8')) #解码

conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8')) #发送响应结果

with open('test.html','rb') as f1: #发送文件给浏览器

conn.send(f1.read())

conn.close()

先运行起来python文件,浏览器输入 127.0.0.1:8080 ,服务器返回一个html文件,并在浏览器终端显示

请求和响应格式

上述的例子在server的控制台有如下的记录,这个是浏览器的请求头,其中第一行GET / HTTP/1.1中,GET是请求方法,/是个请求的文件, HTTP/1.1是协议

标准的请求格式:

升级的web框架

#上面的html太简单,如果增加一些引用,比如样式: ,样式文件中增加一些背景色,让界面复杂一些,就要更改下server端,新建一个css文件,把css文件也发送到客户端:

import socket

sc = socket.socket()

sc.bind(('127.0.0.1',8080))

sc.listen()

while 1:

conn,addr = sc.accept()

data = conn.recv(1024)

request_file = data.decode('utf-8').split('\r\n')[0].split()[1] #根据标准请求头结构,解析出文件名,要先decode

print(data.decode('utf-8'))

conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))

if request_file == '/': #开始判断请求的具体是哪个文件

with open('test.html','rb') as f1:

conn.send(f1.read())

elif request_file == '/css1.css':

with open('css1.css','rb') as f1:

conn.send(f1.read())

conn.close()

#这样的话 也可以添加 js文件 img图片文件的src链接等

并发的web框架

#把服务器返回文件分别写在函数中,并发的方式返回给请求端

import socket

from threading import Thread

sc = socket.socket()

ip_port=('127.0.0.1',8800)

sc.bind(ip_port)

sc.listen()

def html(conn):

with open('test.html', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

def css(conn):

with open('css1.css', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

def js(conn):

with open('js1.js', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

def jquery_js(conn):

with open('jquery-3.5.1.js', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

def png(conn):

with open('1.png', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)] #罗列请求的内容

while 1:

conn,addr=sc.accept()

data = conn.recv(1024) # data是请求头

print(data.decode('utf-8'))

conn.send(b'HTTP/1.1 200 ok\r\n\r\n')

request_path = data.decode('utf-8').split('\r\n')[0].split()[1] # 按照回车换行分割,获取请求的文件名

print(request_path)

for i in request_list:

if request_path == i[0]:

print(i[0])

t = Thread(target=i[1],args=(conn,)) #target 是函数,args 是参数,对应上面多个函数

t.start()

动态web框架

Title

{time_now}

import socket

import time

from threading import Thread

sc = socket.socket()

ip_port=('127.0.0.1',8800)

sc.bind(ip_port)

sc.listen()

def html(conn):

time_now = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime()) #增加一个日期变量,传入到网页中

with open('test.html', 'rb') as f:

content = f.read().decode('utf-8').format(time_now=time_now) #content是个字符串,用一个format格式化一下内部的参数

conn.send(content.encode('utf-8'))

conn.close()

def css(conn):

with open('css1.css', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

def js(conn):

with open('js1.js', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

def jquery_js(conn):

with open('jquery-3.5.1.js', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

def png(conn):

with open('1.png', 'rb') as f:

content = f.read()

conn.send(content)

conn.close()

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)] #罗列请求的内容

while 1:

conn,addr=sc.accept()

data = conn.recv(1024) # data是请求头

print(data.decode('utf-8'))

conn.send(b'HTTP/1.1 200 ok\r\n\r\n')

request_path = data.decode('utf-8').split('\r\n')[0].split()[1] # 按照回车换行分割,获取请求的文件名

print(request_path)

for i in request_list:

if request_path == i[0]:

print(i[0])

t = Thread(target=i[1],args=(conn,)) #target 是函数,args 是参数,对应上面多个函数

t.start()

【20210127】

#之前socket相关的那段代码是服务器程序,用来接收别人的请求,然后处理请求,这些操作wsgi已经帮我们封装好,可以引入wsgiref的python模块来替换我们自己开发的部分socket代码,看python文件中的变化

Title

{time_now}

//js1.js文件

$(window).ready(function(){

$('input[type=button]').click(function(){ //按钮事件

$('div').css('background-color','red');

});

})

/*css1.css文件*/

div{

background-color:pink;

}

import socket

import time

from wsgiref.simple_server import make_server

def html():

time_now = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime()) #传一个日期到网页前端

with open('test.html', 'rb') as f:

content = f.read().decode('utf-8').format(time_now=time_now)

return content.encode('utf-8')

def css():

with open('css1.css', 'rb') as f:

content = f.read()

return content

def js():

with open('js1.js', 'rb') as f:

content = f.read()

return content

def jquery_js():

with open('jquery-3.5.1.js', 'rb') as f:

content = f.read()

return content

def png():

with open('1.png', 'rb') as f:

content = f.read()

return content

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)] #罗列请求的内容

def application(environ,start_response): #应用程序

start_response('200 OK',[('k1','v1'),('k2','v2')]) #首先响应

print(environ) #environ是接收的内容,包括请求头信息

request_path = environ['PATH_INFO']

for i in request_list:

if request_path == i[0]:

ret = i[1]()

return [ret]

else:

return [b'

404, file not found!

']

httpd = make_server('127.0.0.1',8080,application) #创建一个服务器,用来处理请求,替换之前的socket

print('serving http on port 8080...')

httpd.serve_forever() #开始监听

wsgiref+mysql+html

#在前面的基础上添加一个数据库的访问

Title

{time_now}

欢迎{name}访问!

import socket

import time

from wsgiref.simple_server import make_server

import pymysql

def getName(): #数据库获取姓名 ,这个方法可以单独写到操作数据库的python文件中,独自成立模块

conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='test')

cursor = conn.cursor(pymysql.cursors.DictCursor)

sql = "select name from t_user where id=2"

cursor.execute(sql)

data = cursor.fetchone()

conn.commit()

cursor.close()

conn.close()

return data #data结果是个字典形式存储,如果两行就是字典组成的列表,需要用索引获取name值

def html():

time_now = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime())

with open('test.html', 'rb') as f:

content = f.read().decode('utf-8').format(time_now=time_now,name=getName()['name']) #把值格式化format到content字符串中,把数据库内容渲染到网页中,以后还会有表格的渲染,那样渲染数据就更多了

return content.encode('utf-8')

def css():

with open('css1.css', 'rb') as f:

content = f.read()

return content

def js():

with open('js1.js', 'rb') as f:

content = f.read()

return content

def jquery_js():

with open('jquery-3.5.1.js', 'rb') as f:

content = f.read()

return content

def png():

with open('1.png', 'rb') as f:

content = f.read()

return content

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)]

def application(environ,start_response):

start_response('200 OK',[('k1','v1'),('k2','v2')])

print(environ)

request_path = environ['PATH_INFO']

for i in request_list:

if request_path == i[0]:

ret = i[1]()

return [ret]

else:

return [b'

404, file not found!

']

httpd = make_server('127.0.0.1',8080,application)

print('serving http on port 8080...')

httpd.serve_forever()

#结果如下图:

wsgiref+mysql+jinja2

以上方式只是简单渲染,渲染实现了数据和显示的分离,后台数据再网页端用特殊代码代替,还有一种现成的渲染方式jinja2,先pip install jinja2安装下,jinja2适用很多框架,Django,Flask

【20210128】

Django安装(现在才开始Django)

pip install django #命令提示符执行,安装django

命令方式创建一个Django项目

django-admin startproject mysite2 #命令提示符界面执行语句,在当前目录下得到如下的一堆文件,还要在环境变量中才行

#django是个创建项目的工具,可以理解成模块

#manage.py 项目的启动文件

#setting.py 包含项目默认设置,数据库信息,调试标志等

#urls.py 负责把url模式映射到应用程序

#wsgi.py wsgiref模块做简单的web server,和socket有关

#自动生成的这几个文件中没有template,view等文件,这里的mysite2只是一个项目,具体的网站blog还需要再执行以下命令,blog相当于项目中的应用,一个项目可以有很多应用

python manage.py startapp blog #当前路径多出以下文件

#其中

#models.py 是存放表结构的,现在才出现所谓的 MVT 模型

#views.py 是视图函数相关的

python manage.py runserver 8085 #启动项目,如下是个空网站,manage.py文件跟启动有关

用pycharm 创建Django项目

#得到如下一堆文件

下面走通整个项目,让index路径能访问

#配置url.py文件

#配置views.py文件

#settings.py 文件还要添加一句引用

#然后在manage.py文件目录下,命令提示符界面运行一下指令,启动项目

python manage.py runserver 8085

#然后网页端输入 127.0.0.1:8085/index 就会有如下结果:

#如何返回html文件呢

#views文件更改下,然后创建一个login.html文件

Title

账号:

密码:

#前端再访问下 127.0.0.1:8085/index 如下图:

69节入门python_小渣渣学习笔记 python day69 【Django】相关推荐

  1. pythonsocket自定义协议_小渣渣学习笔记 python day28【tcp聊天 udp聊天 粘包 自定义协议 struct模块】...

    tcp 实现聊天功能 server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',22000)) sk.listen() while ...

  2. 69节入门python_第69天:Selenium详解

    by 闲欢 Selenium 环境配置好之后,我们就可以使用 Selenium 来操作浏览器,做一些我们想做的事情了.在我们爬取网页过程中,经常发现我们想要获得的数据并不能简单的通过解析 HTML 代 ...

  3. 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)

    Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...

  4. 《Angular4从入门到实战》学习笔记

    <Angular4从入门到实战>学习笔记 腾讯课堂:米斯特吴 视频讲座 二〇一九年二月十三日星期三14时14分 What Is Angular?(简介) 前端最流行的主流JavaScrip ...

  5. 《Java Web开发入门很简单》学习笔记

    <Java Web开发入门很简单>学习笔记 1123 第1章 了解Java Web开发领域 Java Web主要涉及技术包括:HTML.JavaScript.CSS.JSP.Servlet ...

  6. 小程序 pagescrollto_微信小程序学习笔记(三)-- 首页及详情页开发

    一.常用组件 在上一个章节中讲解了封装请求数据的模块,在此处请求轮播图的数据 1.首页轮播图数据的请求以及渲染 1.1 轮播图数据的请求 pages/home/home.js import 2 使用组 ...

  7. unity3D-游戏/AR/VR在线就业班 C#入门访问修饰符学习笔记

    unity3D-游戏/AR/VR在线就业班 C#入门访问修饰符学习笔记 点击观看视频学习:http://edu.csdn.NET/lecturer/107 访问修饰符 public --公共的,在哪里 ...

  8. 微信小程序学习笔记(1)

    微信小程序学习笔记 1.小程序代码结构 2.逻辑层和视图层 3. 小程序的宿主环境(通信模型.运行机制.组件.API) 4. 数据绑定和事件绑定 1.小程序代码结构 当开发者新建一个工程时,项目文件包 ...

  9. 微信小程序学习笔记一 + 小程序介绍 前置知识

    微信小程序学习笔记一 1. 什么是小程序? 2017年度百度百科十大热词之一 微信小程序, 简称小程序, 英文名 Mini Program, 是一种不需要下载安装即可使用的应用 ( 张小龙对其的定义是 ...

最新文章

  1. Docker(十):Docker实战 Docker 安装 Nginx
  2. Android之选项菜单创建
  3. IOS 实现滚动文字
  4. studio 3t 在ubuntu中使用_在ubuntu中使用ufw配置防火墙
  5. 【存储技术大杂烩】谈谈FC-SAN、IP-SAN、DAS、NAS几种存储技术
  6. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-8CDH5安装和集群配置
  7. anaconda来创建python环境
  8. linux系统声卡安装教程,Linux系统下如何安装声卡驱动?
  9. Linux操作系统多线程信号总结(转)
  10. 凭什么说这门编程语言是下一代 Java?
  11. splice方法_Array中splice用法
  12. saas mysql数据库设计_SaaS模式实现架构实例分析=数据库层的设计
  13. java制作进度条_使用Java高速实现进度条
  14. 基于python物流管理系统毕业设计-python实现快递价格查询系统
  15. 【iOS】一个方法读取图片中的二维码信息
  16. 《认知突围》思维导图精华版
  17. R中两种常用并行方法——2. snowfall
  18. 支付宝手机网站支付、支付查询、退款、退款查询、转账接口整合
  19. 互联网APP监控即时报警解决最终方案及总结
  20. sql 条件查询以及模糊查询

热门文章

  1. 在公众号文章中添加**人员名单
  2. 扫描识别行驶证的软件技术
  3. 第十章、正则表达式和JSON
  4. html中图片不溢出,防止图片过大超出DIV的CSS样式
  5. 【抓包工具】实战:WireShark 捕获过滤器的超全使用教程
  6. vscode全背景图设置技巧
  7. 华为Atlas张迪煊:在最好的时代,做最强AI算力底座
  8. 软件的知识产权保护---著作权法及实施条例
  9. python中assert是什么意思_python assert函数是什么以及如何使用?
  10. unity人物刚体移动_教程篇 | Unity人物移动动画