Django基础知识 web框架的本质详解

一 web框架的本质及自定义web框架

​ 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了。

通过对socket的学习,我们知道网络通信,我们完全可以自己写了,因为socket就是做网络通信用的,下面我们就基于socket来自己实现一个web框架,写一个web服务端,让浏览器来请求,并通过自己的服务端把页面返回给浏览器,浏览器渲染出我们想要的效果。

html文件内容如下,名称为test.html:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <link rel="icon" href="wechat.ico" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
 <!--直接写在html页面里面的css样式是直接可以在浏览器上显示的-->
 <style>
  h1{
   background-color: green;
   color: white;
  }
 </style>
</head>
<body>

<h1>姑娘,你好,我是Jaden,请问约吗?嘻嘻~~</h1>
<!--直接写在html页面里面的img标签的src属性值如果是别人网站的地址(网络地址)是直接可以在浏览器上显示的-->
<!--<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1550395461724&di=c2b971db12eef5d85aba410d1e2e8568&imgtype=0&src=http%3A%2F%2Fy0.ifengimg.com%2Fifengimcp%2Fpic%2F20140822%2Fd69e0188b714ee789e97_size87_w800_h1227.jpg" alt="">--> <!--如果都是网络地址,那么只要你的电脑有网,就可以看到,不需要自己在后端写对应的读取文件,返回图片文件信息的代码,因为别人的网站就做了这个事情了-->
<img src="meinv.png" alt="" width="100" height="100"> <!--如果你是本地的图片想要返回给页面,你需要对页面上的关于这个图片的请求要自己做出响应,这个src就是来你本地请求这个图片,你只要将图片信息读取出来,返回给页面,页面拿到这个图片的数据,就能够渲染出来了,是不是很简单-->

<!--直接写在html页面里面的js操作是直接可以在浏览器上显示的-->
<script>
 alert('这是我们第一个网页')
</script>

<script src="test.js"></script>
</body>
</html>

<!--再准备一个图片,名称为meinv.jpg,再准备一个ico文件,名称为wechat.ico,其实就是个图片文件,微信官网打开之后,在浏览器最上面能够看到-->

然后开始写我们的web框架,我们分这么几步来写:

一、简单的web框架

创建一个python文件,内容如下,名称为test.py:

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()
conn,addr = sk.accept()
from_b_msg = conn.recv(1024)
str_msg = from_b_msg.decode('utf-8')
#socket是应用层和传输层之间的抽象层,每次都有协议,协议就是消息格式,那么传输层的消息格式我们不用管,因为socket帮我们搞定了,但是应用层的协议还是需要咱们自己遵守的,所以再给浏览器发送消息的时候,如果没有按照应用层的消息格式来写,那么你返回给浏览器的信息,浏览器是没法识别的。而应用层的协议就是我们的HTTP协议,所以我们按照HTTP协议规定的消息格式来给浏览器返回消息就没有问题了,关于HTTP我们会细说,首先看一下直接写conn.send(b'hello')的效果,然后运行代码,通过浏览器来访问一下,然后再看这一句conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')的效果
#下面这句就是按照http协议来写的
# conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')
#上面这句还可以分成下面两句来写
conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
with open('test.html','rb') as f:
 f_data = f.read()
conn.send(f_data)

但是我们知道,我们的css和js基本都是写在本地的文件里面的啊,而且我们的图片基本也是我们自己本地的啊,怎么办,我们将上面我们提前准备好的js和css还有那个.ico结尾的图片文件都准备好,来我们在来一个升级版的web框架,其实css、js、图片等文件都叫做网站的静态文件。

首先我们先看一个效果,如果我们直接将我们写好的css和js还有.ico和图片文件插入到我们的html页面里面,就是下面这个html文件

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <link rel="stylesheet" href="test.css" rel="external nofollow" rel="external nofollow" >
 <link rel="icon" href="wechat.ico" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
</head>
<body>
<h1>姑娘,你好,我是Jaden,请问约吗?嘻嘻~~</h1>
<img src="meinv.png" alt="" width="100" height="100">
<script src="test.js"></script>
</body>
</html>

<!--css文件内容如下,名称为test.css: -->
 h1{
  background-color: green;
  color: white;
 }

<!-- js文件内容如下,名称为test.js:-->
 alert('这是我们第一个网页');

二、返回静态文件的高级web框架

import socket

sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()

#首先浏览器相当于给我们发送了多个请求,一个是请求我们的html文件,而我们的html文件里面的引入文件的标签又给我们这个网站发送了请求静态文件的请求,所以我们要将建立连接的过程循环起来,才能接受多个请求,没毛病
while 1:
 conn,addr = sk.accept()
 # while 1:
 from_b_msg = conn.recv(1024)
 str_msg = from_b_msg.decode('utf-8')
 #通过http协议我们知道,浏览器请求的时候,有一个请求内容的路径,通过对请求信息的分析,这个路径我们在请求的所有请求信息中可以提炼出来,下面的path就是我们提炼出来的路径
 path = str_msg.split('\r\n')[0].split(' ')[1]
 print('path>>>',path)
 conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
 #由于整个页面需要html、css、js、图片等一系列的文件,所以我们都需要给人家浏览器发送过去,浏览器才能有这些文件,才能很好的渲染你的页面
 #根据不同的路径来返回响应的内容
 if path == '/': #返回html文件
  print(from_b_msg)
  with open('test.html','rb') as f:
  # with open('Python开发.html','rb') as f:
   data = f.read()
  conn.send(data)
  conn.close()
 elif path == '/meinv.png': #返回图片
  with open('meinv.png','rb') as f:
   pic_data = f.read()
  # conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
  conn.send(pic_data)
  conn.close()
 elif path == '/test.css': #返回css文件
  with open('test.css','rb') as f:
   css_data = f.read()
  conn.send(css_data)
  conn.close()

 elif path == '/wechat.ico':#返回页面的ico图标
  with open('wechat.ico','rb') as f:
   ico_data = f.read()
  conn.send(ico_data)
  conn.close()

 elif path == '/test.js': #返回js文件
  with open('test.js','rb') as f:
   js_data = f.read()
  conn.send(js_data)
  conn.close()

 #注意:上面每一个请求处理完之后,都有一个conn.close()是因为,HTTP协议是短链接的,一次请求对应一次响应,这个请求就结束了,所以我们需要写上close,不然浏览器自己断了,你自己写的服务端没有断,就会出问题。

完全搞定了,自己通过socket已经完全搞定了web项目,激动不,哈哈,我们再来完善一下

三、更高级版(函数+多线程版+动态获取时间戳)web框架

# -*- coding: utf-8 -*-
# @Time : 2019/7/12 17:11
# @Author : AnWen
import time
import socket
from threading import Thread

server = socket.socket()
server.bind(('127.0.0.1', 9000))
server.listen()

def html(conn):
 time_msg=str(time.time())
 with open('test.html', 'r',encoding='utf-8') as f:
  date = f.read()
 # 在网页中定义好特殊符号,用动态的数据去替换提前定义好的特殊符号
 date=date.replace('%这是被替换字符串%',time_msg)
 date=date.encode('utf-8')
 conn.send(date)
 conn.close()

def css(conn):
 with open('test.css', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()

def js(conn):
 with open('test.js', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()

def ico(conn):
 with open('wechat.ico', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()

def jpg(conn):
 with open('window.jpg', 'rb') as f:
  date = f.read()
 conn.send(date)
 conn.close()

#定义一个路径和执行函数的对应关系,不再写一堆的if判断了
urlpatterns = [
 ('/', html),
 ('/test.css', css),
 ('/test.js', js),
 ('/wechat.ico', ico),
 ('/window.jpg', jpg)
]

while True:
 conn, addr = server.accept()
 request_str = conn.recv(1024).decode('utf-8')
 path = request_str.split('\r\n')[0].split(' ')[1]
 print(path)
 # 因为要遵循HTTP协议,所以回复的消息也要加状态行
 conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
 #遍历路径和函数的对应关系列表,并开多线程高效的去执行路径对应的函数,
 for item in urlpatterns:
  if path==item[0]:
   t=Thread(target=item[1],args=(conn,))
   t.start()

四、wsgiref模块版web框架

wsgiref模块其实就是将整个请求信息给封装了起来,就不需要你自己处理了,假如它将所有请求信息封装成了一个叫做request的对象,那么你直接request.path就能获取到用户这次请求的路径,request.method就能获取到本次用户请求的请求方式(get还是post)等,那这个模块用起来,我们再写web框架是不是就简单了好多啊。

对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。

服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。

应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。

这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

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

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

好,接下来我们就看一下(能理解就行,了解就可以了):先看看wsfiref怎么使用:

from wsgiref.simple_server import make_server
# wsgiref本身就是个web框架,提供了一些固定的功能(请求和响应信息的封装,不需要我们自己写原生的socket了也不需要咱们自己来完成请求信息的提取了,提取起来很方便)
#函数名字随便起
def application(environ, start_response):
 '''
 :param environ: 是全部加工好的请求信息,加工成了一个字典,通过字典取值的方式就能拿到很多你想要拿到的信息
 :param start_response: 帮你封装响应信息的(响应行和响应头),注意下面的参数
 :return:
 '''
 start_response('200 OK', [('Content-Type', 'text/html'),('k1','v1')])
 print(environ)
 print(environ['PATH_INFO']) #输入地址127.0.0.1:8080,这个打印的是'/',输入的是127.0.0.1:8080/index,打印结果是'/index'
 return [b'<h1>Hello, web!</h1>']

#和咱们学的socketserver那个模块很像啊
httpd = make_server('127.0.0.1', 8080, application)

print('Serving HTTP on port 8080...')
# 开始监听HTTP请求:
httpd.serve_forever()

来一个完整的web项目,我们需要连接数据库了,所以先到mysql数据库里面准备一些表和数据

# -*- coding: utf-8 -*-
# @Time : 2019/7/12 18:33
# @Author : AnWen
import pymysql

conn = pymysql.connect(
 host='127.0.0.1',
 port=3306,
 user='root',
 password='123456',
 database='day53',
 charset='utf8',
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
#创建表
sql = "create table userinfo(id int primary key auto_increment,name char(12),age int not null);"
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
import pymysql
conn = pymysql.connect(
 host='127.0.0.1',
 port=3306,
 user='root',
 password='123456',
 database='day53',
 charset='utf8',
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
#插入数据
sql = "insert into userinfo(name,age) values ('anwen',20);"
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
# -*- coding: utf-8 -*-
# @Time : 2019/7/12 18:55
# @Author : AnWen
import pymysql
def showdata():
 conn = pymysql.connect(
  host='127.0.0.1',
  port=3306,
  user='root',
  password='123456',
  database='day53',
  charset='utf8',
 )
 cursor = conn.cursor(pymysql.cursors.DictCursor)
 #查询数据
 sql = 'select * from userinfo'
 cursor.execute(sql)
 data=cursor.fetchone()
 conn.close()
 conn.cursor()
 return data
# showdata()

wsgiref模块版web框架

# -*- coding: utf-8 -*-
# @Time : 2019/7/12 12:17
# @Author : AnWen
import time
from wsgiref.simple_server import make_server
from showdata import showdata

def html():
 #获取数据库数据
 userinfo_data=showdata()
 # {'id': 1, 'name': 'anwen', 'age': 20}
 with open('test.html', 'r', encoding='utf-8') as f:
  date = f.read()
 date = date.replace('%这是被替换字符串%', userinfo_data['name'])
 date = date.encode('utf-8')
 return date

def css():
 with open('test.css', 'rb') as f:
  date = f.read()
 return date

def js():
 with open('test.js', 'rb') as f:
  date = f.read()
 return date

def ico():
 with open('wechat.ico', 'rb') as f:
  date = f.read()
 return date

def jpg():
 with open('window.jpg', 'rb') as f:
  date = f.read()
 return date

urlpatterns = [
 ('/', html),
 ('/test.css', css),
 ('/test.js', js),
 ('/wechat.ico', ico),
 ('/window.jpg', jpg)
]

def application(environ, start_response):
 '''
  :param environ: 是全部加工好的请求信息,加工成了一个字典,通过字典取值的方式就能拿到很多你想要拿到的信息
  :param start_response: 帮你封装响应信息的(响应行和响应头),注意下面的参数
  :return:
  '''
 # print(environ)
 start_response('200 ok', [('k1', 'v1')])
 path = environ['PATH_INFO']
 for item in urlpatterns:
  if path == item[0]:
   ret = item[1]()
   break
 else:
  ret = '404 not found!'
 return [ret]

httpd = make_server('127.0.0.1', 9000, application)
print('Serving HTTP on port 9000...')
# 开始监听HTTP请求:
httpd.serve_forever()

# wsgiref本身就是个web框架,提供了一些固定的功能(请求和响应信息的封装,不需要我们自己写原生的socket了也不需要咱们自己来完成请求信息的提取了,提取起来很方便)

模板渲染JinJa2

上面的代码实现了一个简单的动态页面(字符串替换),我完全可以从数据库中查询数据,然后去替换我html中的对应内容(专业名词叫做模板渲染,你先渲染一下,再给浏览器进行渲染),然后再发送给浏览器完成渲染。

这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2  

下载:

pip install jinja2

使用jinja2渲染index2.html文件

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>第一个Web框架</title>
 <link rel="stylesheet" href="test.css" rel="external nofollow" rel="external nofollow" >
 <link rel="icon" href="wechat.ico" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
</head>
<body>
<h1>%这是被替换字符串%</h1>
<h1>{{userinfo}}</h1>
<!--<ul>-->
<!-- {% for k,v in userinfo.items() %}-->
<!--  <li>{{k}}--{{v}}</li>-->
<!-- {% endfor %}-->
<!--</ul>-->
<ul>
 {% for k,v in userinfo.items() %}
  <li>{{v}}</li>
 {% endfor %}
</ul>

<h1>嘻嘻~~</h1>
<img src="window.jpg" alt="" width="100px" height="100px">
<script src="test.js"></script>
</body>
</html>
# -*- coding: utf-8 -*-
# @Time : 2019/7/12 12:17
# @Author : AnWen
import time
from wsgiref.simple_server import make_server
from showdata import showdata
from jinja2 import Template

def html():
 userinfo_data=showdata()
 with open('6jinja2和wsgiref动态框架.html', 'r', encoding='utf-8') as f:
  date = f.read()
 # print(date)
 tem=Template(date) ## 生成模板文件
 print(userinfo_data) #{'id': 1, 'name': 'anwen', 'age': 20}
 date=tem.render({'userinfo':userinfo_data})
 #模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法规则写上,其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容。

 date = date.encode('utf-8')
 return date
def css():
 with open('test.css', 'rb') as f:
  date = f.read()
 return date
def js():
 with open('test.js', 'rb') as f:
  date = f.read()
 return date
def ico():
 with open('wechat.ico', 'rb') as f:
  date = f.read()
 return date
def jpg():
 with open('window.jpg', 'rb') as f:
  date = f.read()
 return date

urlpatterns = [
 ('/', html),
 ('/test.css', css),
 ('/test.js', js),
 ('/wechat.ico', ico),
 ('/window.jpg', jpg)
]

def application(environ, start_response):
 '''
  :param environ: 是全部加工好的请求信息,加工成了一个字典,通过字典取值的方式就能拿到很多你想要拿到的信息
  :param start_response: 帮你封装响应信息的(响应行和响应头),注意下面的参数
  :return:
  '''
 # print(environ)
 ## 设置HTTP响应的状态码和头信息
 start_response('200 ok', [('k1', 'v1')])
 path = environ['PATH_INFO']
 for item in urlpatterns:
  if path == item[0]:
   ret = item[1]()
   break
 else:
  ret = '404 not found!'
 return [ret]

httpd = make_server('127.0.0.1', 9000, application)
print('Serving HTTP on port 9000...')
httpd.serve_forever()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python之Web框架Django项目搭建全过程

    Python之Web框架Django项目搭建全过程 IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 注:可通过pip freeze查看已安装库版本信息. Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后

  • Django+Vue实现WebSocket连接的示例代码

    近期有一需求:前端页面点击执行任务,实时显示后端执行情况,思考一波:发现 WebSocket 最适合做这件事. 效果 测试 ping www.baidu.com 效果 点击连接建立ws连接 后端实现 所需软件包 后端主要借助Django Channels 实现socket连接,官网文档链接 这里想实现每个连接进来加入组进行广播,所以还需要引入 channels-redis . pip channels==2.2.0 channels-redis==2.4.0 引入 settings.py INS

  • Django web框架使用url path name详解

    quicktool/view.py文件修改视图函数index(),渲染一个home.html模板 from django.shortcuts import render def index(request): return render(request, 'home.html') quicktool(应用app)下创建一个templates文件夹(模板),在templates下创建一个home.html <!DOCTYPE html> <html> <head> <

  • 详解基于django实现的webssh简单例子

    本文介绍了详解基于django实现的webssh简单例子,分享给大家,具体如下: 说明 新建一个 django 程序,本文为 chain. 以下仅为简单例子,实际应用 可根据自己平台情况 进行修改. 打开首页后,需要输入1,后台去登录主机,然后返回登录结果. 正常项目 可以post 主机和登录账户,进行权限判断,然后去后台读取账户密码,进行登录. djang后台 需要安装以下模块 安装后会有一个版本号报错,不影响 channels==2.0.2 channels-redis==2.1.0 amq

  • 使用Django2快速开发Web项目的详细步骤

    Django 是一款基于 Python 编写并且采用 MVC 设计模式的开源的 Web 应用框架,早期是作为劳伦斯出版集团新闻网站的 CMS 内容管理系统而开发,后于 2005 年 7 月在 BSD 许可协议下开源,并于 2017 年 12 月 2 日 发布 2.0 正式版. 本文基于<Django 官方 Tutorials>以及<Django REST framework 官方 Tutorials>编写,发稿时所使用的 Django 版本为 2.1.4,Python 版本为 3.

  • Django基础知识 web框架的本质详解

    一 web框架的本质及自定义web框架 ​ 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了. 通过对socket的学习,我们知道网络通信,我们完全可以自己写了,因为socket就是做网络通信用的,下面我们就基于socket来自己实现一个web框架,写一个w

  • Python开发自定义Web框架的示例详解

    目录 开发自定义Web框架 1.开发Web服务器主体程序 2.开发Web框架主体程序 3.使用模板来展示响应内容 4.开发框架的路由列表功能 5.采用装饰器的方式添加路由 6.电影列表页面的开发案例 开发自定义Web框架 接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务.根据请求资源路径的后缀名进行判断: 如果请求资源路径的后缀名是.html则是动态资源请求, 让web框架程序进行处理. 否则是静态资源请求,让web服务器程序进行处理. 1.开发Web服务器主体程序 1.

  • 微信小程序开发数据缓存基础知识辨析及运用实例详解

    提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容. 提示:以下是本篇文章正文内容,下面案例可供参考 一.微信数据缓存是什么? 在实际开发中,在用到一个数据时,我们需要调用api接口去得到,然后渲染在页面中,但是对于一些数据,是经常需要使用的,如果每次使用时都需要调用api接口,会十分麻烦.数据缓存就解决了这个问题,我们可以在初次调用某api得到数据的同时将数据缓存,那么在之后的使用过程

  • Java基础之Web服务器与Http详解

    目录 Web服务器 技术讲解 PHP: JSP/Servlet Web服务器 IIS Tomcat JAVA jdk中的内容 Tomcat Tomcat根目录下的内容 Tomcat的配置 Http 1.什么是Http 2.两个时代 3.Http请求 4. Http响应 Web服务器 技术讲解 微软:国内最早流行的就是ASP 在HTML中嵌入了VB的脚本,ASP+COM 在ASP开放中,基本一个页面都有几千行的业务代码,页面极其混乱 维护成本高 PHP: PHP开发速度很快,功能很强大,跨平台,代

  • python基础知识之索引与切片详解

    目录 基本索引 嵌套索引 切片 numpy.array 索引 一维 numpy.array 索引 二维 pandas Series 索引 pandas DataFrame 索引 填坑 总结 基本索引 In [4]: sentence = 'You are a nice girl'In [5]: L = sentence.split()In [6]: LOut[6]: ['You', 'are', 'a', 'nice', 'girl'] # 从0开始索引In [7]: L[2]Out[7]: '

  • java基础知识I/O流使用详解

    "流"概念源于UNIX中的管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等,它屏蔽了实际的I/O设备中处理数据的细节.   一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL. 流的方向是重要的,根据流的方向,流可以分为两类:输入流和输出流.其实输入/输出是想对于内存来说的.实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对于输入流,可不必

  • Docker基础知识之Linux namespace图文详解

    前言 Docker 是"新瓶装旧酒"的产物,依赖于 Linux 内核技术 chroot .namespace 和 cgroup.本篇先来看 namespace 技术. Docker 和虚拟机技术一样,从操作系统级上实现了资源的隔离,它本质上是宿主机上的进程(容器进程),所以资源隔离主要就是指进程资源的隔离.实现资源隔离的核心技术就是 Linux namespace.这技术和很多语言的命名空间的设计思想是一致的(如 C++ 的 namespace). 隔离意味着可以抽象出多个轻量级的内核

  • Django基础知识与基本应用入门教程

    本文实例讲述了Django基础知识与基本应用.分享给大家供大家参考,具体如下: MVC模式和MTV模式 MVC model view controller MTV model templates view controller Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM)        Template(模版):负责如何把页面展示给用户        View(视图):负责业务逻辑,并在适当的

  • Java web基础学习之开发环境篇(详解)

    Tomcat + Eclipse添加Java EE插件 因为之前进行Java SE学习已经配置了JDK,安装了Eclipse for Java SE,所以选择了在Eclipse上添加插件的方式来配置Web开发环境 Tomcat是免安装版,直接解压即可: Eclipse中"帮助-安装新软件",work with处选择Mars - http://download.eclipse.org/releases/mars(注意对应自己版本): 选择Web.Java EE那个选项进行安装即可,如果报

  • django rest framework之请求与响应(详解)

    前言:在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我们还知道RESTful API的另一个特性就是,发送不同的请求动作,会返还不同的响应,这篇文章就讲一下django-rest-framework这个工具在这方面给我们带来的便捷操作. 一.Request对象 平时我们在写Django的视图函数的时候,都会带上一个request参数,这样就能处理平时搭建网站时,浏览器访问网页时发出的常规的HttpReques

随机推荐