day50(web框架Django)

今日内容详细

#前端:就是与用户打交到,然后给用户展示的一个界面
#web框架:他起到一个承上启下的一个作用  这个东西可以将前端还有数据库整合到一起
#数据库:数据库就是存放各种数据进行一个数据的存储并保护
'web框架很重要!!!!

简单了解一下web框架

img

 我们常用的web前端框架其实简单称呼叫web框架,现阶段web前端技术成熟,从视觉体验到用户体验都是比较好的,这也是从简单到复杂的web前端框架技术实现的,在国内前端技术开发人员也是非常的多,市面上的前端框架可以说是眼花缭乱,这里写这篇文章就是让你在使用不同的前端框架的时候能够明确的知道自己的选择。
Web前端框架工作原理:

  在我们讨论框架之前,我们需要理解 Web 如何“工作”的。为此,我们将深入挖掘你在浏览器里输入一个 URL 按下 Enter 之后都发生了什么。在你的浏览器中打开一个新的标签,浏览http://www.uileader.com。我们讨论为了显示这个页面,浏览器都做了什么事情(不关心 DNS 查询)。

Web 服务器

  每个页面都以 HTML 的形式传送到你的浏览器中,HTML 是一种浏览器用来描述页面内容和结构的语言。那些负责发送 HTML 到浏览器的应用称之为“Web 服务器”,会让你迷惑的是,这些应用运行的机器通常也叫做 web 服务器。

  然而,最重要的是要理解,到最后所有的 web 应用要做的事情就是发送 HTML 到浏览器。不管应用的逻辑多么复杂,最终的结果总是将 HTML 发送到浏览器(我故意将应用可以响应像 JSON 或者 CSS 等不同类型的数据忽略掉,因为在概念上是相同的)。

HTTP

  浏览器从 web 服务器(或者叫应用服务器)上使用 HTTP 协议下载网站,HTTP 协议是基于一种 请求-响应(request-response)模型的。客户端(你的浏览器)从运行在物理机器上的 web 应用请求数据,web 应用反过来对你的浏览器请求进行响应。

  重要的一点是,要记住通信总是由客户端(你的浏览器)发起的,服务器(也就是 web 服务器)没有办法创建一个链接,发送没有经过请求的数据给你的浏览器。如果你从 web 服务器上接收到数据,一定是因为你的浏览器显示地发送了请求。

HTTP Methods

  在 HTTP 协议中,每条报文都关联方法(method 或者 verb),不同的 HTTP 方法对应客户端可以发送的逻辑上不同类型的请求,反过来也代表了客户端的不同意图。例如,请求一个 web 页面的 HTML,与提交一个表单在逻辑上是不同的,所以这两种行为就需要使用不同的方法。

HTTP GET

GET 方法就像其听起来的那样,从 web 服务器上 get(请求)数据。GET 请求是到目前位置最常见的一种 HTTP 请求,在一次 GET 请求过程中,web 应用对请求页面的 HTML 进行响应之外,就不需要做任何事情了。特别的,web 应用在 GET 请求的结果中,不应该改变应用的状态(比如,不能基于 GET 请求创建一个新帐号)。正是因为这个原因,GET 请求通常认为是“安全”的,因为他们不会导致应用的改变。

HTTP POST

  显然,除了简单的查看页面之外,应该还有更多与网站进行交互的操作。我们也能够向应用发送数据,例如通过表单。为了达到这样的目的,就需要一种不同类型的请求方法:POST。POST 请求通常携带由用户输入的数据,web 应用收到之后会产生一些行为。通过在表单里输入你的信息登录一个网站,就是 POST 表单的数据给 web 应用的。

  不同于 GET 请求,POST 请求通常会导致应用状态的改变。在我们的例子中,当表单 POST 之后,一个新的账户被创建。不同于 GET 请求,POST 请求不总是生成一个新的 HTML 页面发送到客户端,而是客户端使用响应的响应码(response code)来决定对应用的操作是否成功。

HTTTP Response Codes

  通常来说,web 服务器返回 200 的响应码,意思是,“我已经完成了你要求我做的事情,一切都正常”。响应码总是一个三位数字的代号,web 应用在每个响应的同时都发送一个这样的代号,表明给定的请求的结果。响应码 200 字面意思是“OK”,是响应一个 GET 请求大多情况下都使用的代号。然而对于 POST 请求, 可能会有 204(“No Content”)发送回来,意思是“一切都正常,但是我不准备向你显示任何东西”。

Web 应用

  你可以仅仅使用 HTTP GET 和 POST 做很多事情。一个应用程序负责去接收一个 HTTP 请求,同时给以 HTTP 响应,通常包含了请求页面的 HTML。POST 请求会引起 web 应用做出一些行为,可能是往数据库中添加一条记录这样的。还有很多其它的 HTTP 方法,但是我们目前只关注 GET 和 POST。

  那么最简单的 web 应用是什么样的呢?我们可以写一个应用,让它一直监听 80 端口(著名的 HTTP 端口,几乎所有 HTTP 都发送到这个端口上)。一旦它接收到等待的客户端发送的请求连接,然后它就会回复一些简单的 HTML。

  下面是程序的代码:

import socketHOST = ''PORT = 80listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)listen_socket.bind((HOST, PORT))listen_socket.listen(1)connection, address = listen_socket.accept()request = connection.recv(1024)connection.sendall(b"""HTTP/1.1 200 OKContent-type: text/html

<html>    <body>        <h1>Hello, World!</h1>    </body></html>""")connection.close()

  (如果上面的代码不工作,试着将 PORT 改为类似 8080 这样的端口。)

  这个代码接收简单的链接和简单的请求,不管请求的 URL 是什么,它都会响应 HTTP 200(所以,这不是一个真正意义上的 web 服务器)。Content-type:text/html 行代码的是 header 字段,header 用来提供请求或者响应的元信息。这样,我们就告诉了客户端接下来的数据是 HTML。

请求的剖析

  如果看一下测试上面程序的 HTTP 请求,你会发现它和 HTTP 响应非常类似。第一行<HTTP Method> <URL> <HTTP version>,在这个例子中是 GET / HTTP/1.0。第一行之后就是一些类似Accept: */* 这样的头(意思是我们希望在响应中接收任何内容)。

  我们响应和请求有着类似的第一行,格式是<HTTP version> <HTTP Status-code> <Status-code Reason Phrase>,在外面的例子中是HTTP/1.1 200 OK 。接下来是头部,与请求的头部有着相同的格式。最后是响应的实际包含的内容。注意,这会被解释为一个字符串或者二进制文件, Content-type 头告诉客户端怎样去解释响应。

  解决路由和模板两大问题


  围绕建立 web 应用的所有问题中,两个问题尤其突出:

1.我们如何将请求的 URL 映射到处理它的代码上?

2.我们怎样动态地构造请求的 HTML 返回给客户端,HTML 中带有计算得到的值或者从数据库中取出来的信息?

  每个 web 框架都以某种方法来解决这些问题,也有很多不同的解决方案。用例子来说明更容易理解,所以我将针对这些问题讨论 Django 和 Flask 的解决方案。但是,首先我们还需要简单讨论一下 MVC 。
 Web前端框架工作原理:

  在我们讨论框架之前,我们需要理解 Web 如何“工作”的。为此,我们将深入挖掘你在浏览器里输入一个 URL 按下 Enter 之后都发生了什么。在你的浏览器中打开一个新的标签,浏览http://www.uileader.com。我们讨论为了显示这个页面,浏览器都做了什么事情(不关心 DNS 查询)。

Web 服务器

  每个页面都以 HTML 的形式传送到你的浏览器中,HTML 是一种浏览器用来描述页面内容和结构的语言。那些负责发送 HTML 到浏览器的应用称之为“Web 服务器”,会让你迷惑的是,这些应用运行的机器通常也叫做 web 服务器。

  然而,最重要的是要理解,到最后所有的 web 应用要做的事情就是发送 HTML 到浏览器。不管应用的逻辑多么复杂,最终的结果总是将 HTML 发送到浏览器(我故意将应用可以响应像 JSON 或者 CSS 等不同类型的数据忽略掉,因为在概念上是相同的)。

HTTP

  浏览器从 web 服务器(或者叫应用服务器)上使用 HTTP 协议下载网站,HTTP 协议是基于一种 请求-响应(request-response)模型的。客户端(你的浏览器)从运行在物理机器上的 web 应用请求数据,web 应用反过来对你的浏览器请求进行响应。

  重要的一点是,要记住通信总是由客户端(你的浏览器)发起的,服务器(也就是 web 服务器)没有办法创建一个链接,发送没有经过请求的数据给你的浏览器。如果你从 web 服务器上接收到数据,一定是因为你的浏览器显示地发送了请求。

HTTP Methods

  在 HTTP 协议中,每条报文都关联方法(method 或者 verb),不同的 HTTP 方法对应客户端可以发送的逻辑上不同类型的请求,反过来也代表了客户端的不同意图。例如,请求一个 web 页面的 HTML,与提交一个表单在逻辑上是不同的,所以这两种行为就需要使用不同的方法。

HTTP GET

GET 方法就像其听起来的那样,从 web 服务器上 get(请求)数据。GET 请求是到目前位置最常见的一种 HTTP 请求,在一次 GET 请求过程中,web 应用对请求页面的 HTML 进行响应之外,就不需要做任何事情了。特别的,web 应用在 GET 请求的结果中,不应该改变应用的状态(比如,不能基于 GET 请求创建一个新帐号)。正是因为这个原因,GET 请求通常认为是“安全”的,因为他们不会导致应用的改变。

HTTP POST

  显然,除了简单的查看页面之外,应该还有更多与网站进行交互的操作。我们也能够向应用发送数据,例如通过表单。为了达到这样的目的,就需要一种不同类型的请求方法:POST。POST 请求通常携带由用户输入的数据,web 应用收到之后会产生一些行为。通过在表单里输入你的信息登录一个网站,就是 POST 表单的数据给 web 应用的。

  不同于 GET 请求,POST 请求通常会导致应用状态的改变。在我们的例子中,当表单 POST 之后,一个新的账户被创建。不同于 GET 请求,POST 请求不总是生成一个新的 HTML 页面发送到客户端,而是客户端使用响应的响应码(response code)来决定对应用的操作是否成功。

HTTTP Response Codes

  通常来说,web 服务器返回 200 的响应码,意思是,“我已经完成了你要求我做的事情,一切都正常”。响应码总是一个三位数字的代号,web 应用在每个响应的同时都发送一个这样的代号,表明给定的请求的结果。响应码 200 字面意思是“OK”,是响应一个 GET 请求大多情况下都使用的代号。然而对于 POST 请求, 可能会有 204(“No Content”)发送回来,意思是“一切都正常,但是我不准备向你显示任何东西”。

Web 应用

  你可以仅仅使用 HTTP GET 和 POST 做很多事情。一个应用程序负责去接收一个 HTTP 请求,同时给以 HTTP 响应,通常包含了请求页面的 HTML。POST 请求会引起 web 应用做出一些行为,可能是往数据库中添加一条记录这样的。还有很多其它的 HTTP 方法,但是我们目前只关注 GET 和 POST。

  那么最简单的 web 应用是什么样的呢?我们可以写一个应用,让它一直监听 80 端口(著名的 HTTP 端口,几乎所有 HTTP 都发送到这个端口上)。一旦它接收到等待的客户端发送的请求连接,然后它就会回复一些简单的 HTML。

  下面是程序的代码:

import socketHOST = ''PORT = 80listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)listen_socket.bind((HOST, PORT))listen_socket.listen(1)connection, address = listen_socket.accept()request = connection.recv(1024)connection.sendall(b"""HTTP/1.1 200 OKContent-type: text/html

<html>    <body>        <h1>Hello, World!</h1>    </body></html>""")connection.close()

  (如果上面的代码不工作,试着将 PORT 改为类似 8080 这样的端口。)

  这个代码接收简单的链接和简单的请求,不管请求的 URL 是什么,它都会响应 HTTP 200(所以,这不是一个真正意义上的 web 服务器)。Content-type:text/html 行代码的是 header 字段,header 用来提供请求或者响应的元信息。这样,我们就告诉了客户端接下来的数据是 HTML。

请求的剖析

  如果看一下测试上面程序的 HTTP 请求,你会发现它和 HTTP 响应非常类似。第一行<HTTP Method> <URL> <HTTP version>,在这个例子中是 GET / HTTP/1.0。第一行之后就是一些类似Accept: */* 这样的头(意思是我们希望在响应中接收任何内容)。

  我们响应和请求有着类似的第一行,格式是<HTTP version> <HTTP Status-code> <Status-code Reason Phrase>,在外面的例子中是HTTP/1.1 200 OK 。接下来是头部,与请求的头部有着相同的格式。最后是响应的实际包含的内容。注意,这会被解释为一个字符串或者二进制文件, Content-type 头告诉客户端怎样去解释响应。

  解决路由和模板两大问题


  围绕建立 web 应用的所有问题中,两个问题尤其突出:

1.我们如何将请求的 URL 映射到处理它的代码上?

2.我们怎样动态地构造请求的 HTML 返回给客户端,HTML 中带有计算得到的值或者从数据库中取出来的信息?

  每个 web 框架都以某种方法来解决这些问题,也有很多不同的解决方案。用例子来说明更容易理解,所以我将针对这些问题讨论 Django 和 Flask 的解决方案。但是,首先我们还需要简单讨论一下 MVC 。

img

纯手工搭建web框架

首先来说因为web框架可以进行前后端的一个交互,将前端和数据库整合到一起基于互联网传输的一个python 代码,所以web框架也可以简单的理解为是软件开发架构里面的'服务端'

python主流的一些web框架

#首先就是耳熟能详的django:
简单概述django它本身的一个特点  :优点就是大而全 其本身自带的一个功能特别多  但是!有时候可能会略显笨重会出现那种'杀鸡焉用牛刀的感觉'

在这里插入图片描述

flask框架轻量级

 刚好跟django有点相反  他是小而精  也不能说相反  其实它本身第三方模块也是超级多的  甚至于说他的一个第三方模块比django还会多  将其第三方的模块加起来完全可以盖过Django并且也越来越像Django
他的一个不足之处就是过于依赖第三方 有时候反而会被第三方所影响

img

tornado

其本身英文意思就是龙卷风; 旋风;所以他是一个速度极快 甚至可以用于充当游戏服务器
非阻塞式的服务器
速度相当快,使用了epoll非阻塞的方式,每秒可以处理数以千计的连接。
单进程单线程异步IO的网络模型
特点
轻量级Web框架
异步非阻塞IO处理方式(epoll)
异步非阻塞框架 

img

注:

"""
框架的核心逻辑几乎是一致的 我们在学习的时候只需要先学会一种
之后就可以触类旁通 但是需要强调的是:千万不用同时学习!!!
"""

django框架简介

#首先就是它的一个版本问题:
django3.X:默认支持异步功能
  django2.X:默认不支持异步
  django1.X:默认不支持异步

  django1.11.X LTS 2018年发布
  django2.2.X	 LTS 2020年发布
  # 之前使用的是1.11 有些新项目逐步过渡到2.2 自己私下也研究过3.2
三个版本也有着不同的一个特点
如果我们选择一个进行学习的话可以是从最开始的版本开始或者基于2.x的一个版本因为功能基本上是一致的,而三版本的话就是多了一个功能而且还是一个半成品不完善  所以学习那个版本并不是很重要,也不用过多的去纠结这个·····
# 启动问题
	django启动可能报错的原因
  	1.计算机名称不能含有中文
    	直接修改即可
    2.不同版本的解释器可能会报错
    	找到报错信息的最后一行提示对应的代码 删除源文件逗号即可
      	eg: 解释器推荐使用python3.6 几乎不会报错
      			解释器如果是高版本使用django1.11可能会报错
            解释器如果是低版本使用django2、3也可以报错
    3.项目中所有的文件名称最好使用英文
    4.一个pycharm窗口尽量就是一个完整的项目 不要嵌套
   
# 下载
	pip3 install django==1.11.11
  '''如果之前下载了其他版本不用管 自动替换!!!'''

django的基本使用

下载之后你可以看一下是否下载成功  ··可以直接在cmd窗口直接输入"django-admin"有反应就是下载成功了就可以开始你学习强大的django框架了

下面看一下他的基本使用

这是上课老师进行的一个详细笔记
# 验证是否下载成功
	cmd窗口直接输入django-admin有反应就是成功了
# 命令操作django
	1.创建django项目
  	django-admin startproject 项目名(mysite)
	2.启动django项目
  	cd 项目名(mysite)
    python3 manage.py runserver IP:PORT
  3.创建app应用
  	python3 manage.py startapp 应用名(app01)
    '''命令行无法自动创建模板文件夹 需要自己执行命令创建'''
# pycharm操作django
	1.new project
  	选择django 填写应用即可
    '''pycharm默认会自动帮你创建模板文件夹 并提供创建一个app的功能'''
  2.创建更多的app
  	tools
    	run manage.py task 命令自动提示
  3.启动项目
  	直接点击绿色箭头 
    	还可以修改端口号 edit configurations

copy

1.创建虚拟环境(所有安装包的过程都需要联网)

mkvirtualenv 虚拟环境名字 -p python3
例:
mkvirtualenv django_env - p python3

2.安装Django包

进入虚拟环境后输入:
pip3 install django==1.11.11
安装完成后输入pip3 list查看一下是否存在django1.11.11
# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 查看所有虚拟环境和切换虚拟环境
deactivate # 退出当前虚拟环境
# pip3
pip3 install # 联网安装包
pip3 unstall # 卸载安装包
pip3 list # 查看安装包

# 这个工程会创建在当前目录下,所以想要在那个目录下创建工程就先到那个目录下,或者加上路径。
#创建工程

django-admin startproject 工程名字
例:
django-admin startproject zdemo
#创建视图

打开刚创建的params模块,在views.py中编写视图代码

from django.http import HttpResponse

def index(request):
    
    return HttpResponse("好久不见..")
#定义路由URL

1)在子应用中创建一个urls.py的文件用于保存该应用的路由(可从主路由中复制)

2)在params/urls.py文件中定义路由信息

from django.conf.urls import url
from . imrpot views

urlpatterns = {
    # 添加
    url(r'^login/$', views.index),
}

应用APP

app创建app应用:
(application)就是应用的作用,当我们的项目足够大的时候,例如路由或者静态文件、模板文件都写在一起,比较臃肿,因此我们将功能单独分成多个app进行开发。
举个例子:一个项目project就相当于 某某大学, 一个app就相当于xx学院。
Django本身是鼓励开发者进行相对独立的项目开发的,因此我们建议以后使用app进行开发。
django本身类似于是一个空壳子 真正的功能是由里面的各个应用决定

django框架相当于是一所大学 应用相当于是大学里面的各个学院
	大学其实是个壳子 负责提供环境 
  学院才是一个个真正具备特定功能的集合

eg:
  使用django写一个淘宝
  	淘宝里面有很多功能模块
    	我们应该先创建一个空的django项目然后根据功能的不同创建不同的应用
      	django项目
        	app01(user)
          app02(order)
          app03(goods)
          app04(backend)

django主要文件介绍

day50_1项目文件名
	day50_1同名文件夹
  	# settings.py		项目配置文件
    # urls.py				路由层
  manage.py
  	django入口文件 很多命令都需要该文件支持
  db.sqlite3
  	django启动之后才会生成的文件 其实就是django自带的小型数据库
  templates文件夹
  	模板层
  app01应用文件夹
  	# migrations文件夹			数据迁移记录(后续讲解)
    # admin.py						django自带的后台管理(后续讲解)
    # apps.py							用于app的注册(后续讲解)
    # models.py						专门用于操作数据库(后续讲解 很重要)
    # views.py						视图层
  
"""
创建应用之后 一定要去配置文件中注册才能生效
	'app01.apps.App01Config'  完整语法
	'app01'										简写语法
"""
--mysite文件夹

	---settings.py 配置文件

	---urls.py	路由与函数对应关系(路由层)

	---wsgi.py	wsgiref模块(不考虑)

--manage.py	django的入口文件

--db.sqlite3	django自带的sqlite3数据库(小型数据库 功能不是很多 还有bug)

--app01文件夹

	---admin.py 后台管理

	---apps.py	注册使用

	---migrations文件夹	数据库迁移记录

	---models.py	数据库相关饿 模型类(orm)

	---tests.py	测试文件

	---views.py	视图函数(视图层)

纯手撸web框架

"""
web框架:将前端、数据库整合到一起的基于互联网传输的python代码
	web框架也可以简单的理解为是软件开发架构里面的'服务端'
"""
# 1.搭建简易版本服务端
	socket模块
# 2.遵循HTTP协议
	四大特性、数据格式、响应状态码
# 3.基于不同的后缀响应不同的内容
	如何获取用户输入的url后缀>>>:HTTP请求数据
    /favicon.ico直接忽略 不影响判断
  利用字符串切割和索引取值获取相应数据
import socket


server = socket.socket()
server.bind(('127.0.0.1', 8082))
server.listen(5)


while True:
    sock, addr = server.accept()
    data = sock.recv(1024)
    # 将请求相关数据先转成字符串
    data_str = data.decode('utf8')  # 'GET /login HTTP/1.1\r\nHost: 127.0.0.1:8081\r\n......'
    sock.send(b'HTTP1.1 200 OK\r\n\r\n')
    # 然后去字符串中截取出我们需要的内容(按照空格切割字符串 获取第二个元素即可)
    current_path = data_str.split(' ')[1]
    # 根据后缀的不同返回不同的内容
    if current_path == '/login':
        sock.send(b'hello login!!!')
    elif current_path == '/register':
        sock.send(b'hello register')
    else:
        sock.send(b'404 error')
   
"""
上述框架缺陷:
	1.服务端起始代码过于重复
	2.针对HTTP请求数据没有完善的处理方式
	3.并发量问题
"""

基于wsgiref模块

# 1.利用模块搭建服务端
# 2.利用模块处理好的HTTP字典数据编写业务
	查找用户url后缀对象的键值对数据
from wsgiref import simple_server


def run(request, response):
    """
    :param request: 请求相关的数据
    :param response: 响应相关的数据
    :return: 返回给客户端的展示数据
    """
    # print(request)  # 字典类型的数据(模块自动处理HTTP请求数据 便于后续数据获取)
    response('200 OK', [])  # 固定编写 无需掌握
    current_path = request.get("PATH_INFO")
    if current_path == '/login':
        return [b'hello login html']
    elif current_path == '/register':
        return [b'hello register html']
    return [b'404 error']


if __name__ == '__main__':
    server = simple_server.make_server('127.0.0.1', 8080, run)
    '''一致监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
    server.serve_forever()

优化措施

1.如果网站很多 是不是就是以为的添加elif
2.每个分支下的功能根据业务逻辑的不同可能会比较复杂
"""上述两个问题需要做优化处理"""
将匹配和功能封装成 元组和函数
"""所有的代码全部放在一个py文件过于冗余 不便于后期管理维护"""
根据功能的不同拆分成不同的py文件
	urls.py						对应关系的存储
  views.py					业务逻辑的编写
# 以后要想新增功能 只需要在urls.py中添加对应关系 view.py中编写函数
"""业务函数的代码中 可能会频繁的使用到不同的html页面"""
为了避免文件类型的混乱 单独开设一个文件夹存储所有的html文件
	templates文件夹		存储项目所需的html文件
"""项目中的html文件 也有可能需要用到css、js、第三方框架文件"""
html所学的css、js、第三方框架代码都是写完之后很少做改动的文件 所以可以统一存放在某个文件夹下
	static文件夹				存储项目所需的'静态文件'(后续再讲)
 

基于上述优化之后 整个项目结构清晰 管理维护都很方便!!!

动静态网页

静态网页
	页面上的数据是直接写死的 万年不变
  	eg:上述项目中编写的 error.html func.html
动态网页
	页面上的数据是通过代码动态获取的 实时可变
  	eg:
      1.页面上展示当前时间(后端获取传递给前端界面)
      2.页面上展示数据库数据(后端链接数据库查询数据再传递给页面)
   
案例1: 页面上展示当前时间
  def get_time(request):
    # 1.获取当前时间
    import time
    c_time = time.strftime('%Y-%m-%d %X')
    # 2.读取html文件
    with open(r'templates/get_time.html','r',encoding='utf8') as f:
        data = f.read()
    # 3.思考:如何给字符串添加一些额外的字符串数据>>>:字符串替换
    new_data = data.replace('asdaksdjal',c_time)
    return new_data

案例2: 将字典传递给页面 并且在页面上 还可以使用字典的操作方法
  jinja2模板语法

jinja2模块

# 第三方模块
	pip3 install jinja2
# 功能介绍
	在编写前后端不分离项目的时候 可以使用该模块提供的模板语法简单快速的在html页面是使用类似于后端的代码语法操作数据
# 模板语法
	'''目前只做简单了解 后面都会详细的讲!!!'''
  temp_obj.render({'user':user_dict,'new_list':new_list})

	<p>{{ user }}</p>
  <p>{{ user.name }}</p>
  <p>{{ user['pwd'] }}</p>
  <p>{{ user.get('hobby') }}</p>
  
  {% for i in new_list %}
        <span>元素:{{ i }}</span>
  {% endfor %}
# 获取数据库中的数据展示到前端页面
	还是用的上述模板语法

框架请求流程

参考群内截图:仅限于我们自己编写的web框架(真正的框架其实跟这个差不多)

urls.py
	后缀与函数名对应关系
  ('/index',register)
  	后缀专业名词称之为'路由'
    函数名专业名词称之为'视图函数'
    urls.py专业名词称之为'路由层'

views.py
	专门编写业务逻辑代码
  	可以是函数 也可以是类
    	函数专业名词称之为'视图函数'
    	类专业名词称之为'视图类'
      views.py专业名词称之为'视图层'

templates文件夹
	专门存储html文件
  	html文件专业名词称之为'模板文件'
    templates文件夹专业名词称之为'模板层'

补充HTTP协议Copy

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同, 用于客户端和服务器之间的通信。请求访问文本或图像等资源的一端称为客户端, 而提供资源响应的一端称为服务器端。
#HTTP之URL
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息URL。
就以下面这个URL为例,介绍下普通URL的各部分组成

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的URL可以看出,一个完整的URL包括以下几部分:
1、协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

2、域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

3、端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80

4、虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

5、文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

6、锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

7、参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

原文链接:https://blog.csdn.net/ergouge/article/details/8185219
request的功能:

获取请求行(getContextPath、getServletPath、getRequestURI,getQueryString)
获取请求头(getHeader)
获取请求体(getReader / getInputStream)
request其他功能:

获取请求参数(getParameter)
请求转发(request.getRequestDispatcher("/另一个资源路径").forward(request, response))
共享数据(setAttribute / getAttribute)
获取ServletContext对象(getServletContext)
HTTP(Hyper Text Transfer Protocol ,超文本传输协议),定义了客户端与服务器端通信时的数据格式
 
请求消息数据格式:

请求行——格式:请求方式 请求url 请求协议/版本,比如:GET /login.html HTTP/1.1
关于请求方式:HTTP协议有7种请求方式,常用的有两种:
▶ GET:请求参数在请求行中(url中);请求的url有长度限制;不太安全
▶ POST:请求参数在请求体中;请求的url没有长度限制;相对安全

请求头——格式:键值对。是客户端浏览器告诉服务器的信息。
关于几个重要的请求头键/值:
▶ User-Agent:浏览器告诉服务器"我是哪个版本的浏览器"。这样服务器才能"对症下药",解决浏览器兼容性问题
▶ Referer:告诉服务器"我的请求的来源"。这被用于 防盗链 和 统计工作。

请求空行——格式:就是个空行。分割了 请求头 和 请求体

请求体——传递的信息。POST方式有请求体,GET方式没有。流的形式获取。

day50单词

socket:插座 ; 窝 ; 插口,插孔,管座 ; 托座 ; 孔穴 ; 槽 
accpet:接受 同意 接受 认可
bind:绑定 捆绑 约束
listen:听 ; 听从 ; 听信 ; 听着
server:服务器
decode:解码
send: 邮寄 ; 发送 ; 传达 ; 转致 ; 告知 ; 派遣 ; 打发 ;
error:错误 差错
split: 分裂 分开 切割
address:地址
data:数据  资料
path:数据
current :现在的当前的
response:回答 回复 相应 
request:要求  请求  
param:参数
simple_server.:简单的服务器
make_server:。制作服务器
make:制造 制作组装
info:信息 消息 咨询
server serve_forever:服务器永远为你服务
forever 永远 ; 长久地 ; 老是,没完没了地
serve:提供
static:静止
templates:模板
url:网址
tornado:龙卷风 
encoding:编码
return:返回

posted @ 2022-05-11 18:19  文质彬彬赵其辉  阅读(41)  评论(0)    收藏  举报