Django底层原理简介与安装
Django环境目录搭建一栏:

利用wsgiref模块封装好的socket搭建服务端:
#利用wsgiref模块封装好的socket演示操作(例如accept\recv)
#也可以实现socket服务端的功能 from wsgiref.simple_server import make_server
#拆分开之后需要导入关联相应表格
import my_urls
from views import * #分到views里面
# def index(response):
# return 'ok'
#
# def time(response):
# return 'time'
#
# def error(response):
# return '404' #分到my_urls里面
# urls=[
# ('/index',index),
# ('/time',time),
#
# ] def my_server(environ,start_response):
#这里就不需要再accept、recv了,因为封装好了,只需要对接收数据进行处理就好
#environ是个字典:把请求头里所有的东西都切割出来了,不用再手动进行处理
#start_response是个函数:响应头信息HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n #取请求的地址:
# print(environ['PATH_INFO']) # 'PATH_INFO': '/ ',默认是空 类似于:GET /index HTTP/1.1 访问时输入什么就会返回什么 # conn.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')类似于这个功能
start_response('200 OK',[('Content-Type','text/html')])
# return [b'Hello wsgiref_socket'] #到这里就可以模拟MyWeb.py里面的socket服务端功能了 func=None
#遍历取出路由列表里面的各个元组值
# for url in urls:
for url in my_urls.urls: #判断用户请求的地址是不是写在路由里面的地址
if url[0] == environ['PATH_INFO']:
func=url[1] #相当与 func=index 或者 func=time
break
#判断是否为空
if func:
response=func(environ) #即 index(environ)
else:
response=error(environ) #wsgiref规定返回值就是要写在列表里面
return [response,] if __name__ == '__main__':
my=make_server('127.0.0.1',8002,my_server)
print('监听8002端口')
my.serve_forever()
my_urls路由配置:
import views urls=[
('/index',views.index),
('/time',views.time),
('/user_list',views.user_list),
('/favicon.ico',views.favicon) ]
templates渲染html模板(和路由层对应):
1.index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index界面</title>
</head>
<body>
<img src="https://goss.veer.com/creative/vcg/veer/1600water/veer-136737644.jpg" alt="index">
</body>
</html>
2.time.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
@@time@@
</body>
</html>
3.user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
<style>
th {
background: gray;
}
td { border: 1px solid black;
width: 200px;
height: 50px;
text-align: center;
}
th {
border: 1px solid black;
width: 200px;
height: 50px;
text-align: center;
}
</style>
</head>
<body>
<table style="border: 1px solid black;border-collapse: collapse;">
<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.password}}</td>
</tr> {%endfor%}
</tbody> </table>
</body>
</html>
views视图配置:
import pymysql
#jinja2是模板渲染(用于去渲染user_list.html中的文件)
from jinja2 import Template #把wsgiref里面的time index error 函数拆分过来 def index(response):
# return 'ok'
#从template里面调取网页(里面设定要响应返回给客户端的内容)
with open('templates/index.html','r',encoding='utf-8') as f:
data=f.read()
return data.encode('utf-8') def time(response):
# return 'time'
import datetime
now = datetime.datetime.now().strftime('%Y-%m-%d %X')
with open('templates/two.html', 'r', encoding='utf-8') as f:
data = f.read()
data = data.replace('@@time@@',now)
return data.encode('utf-8') def error(response):
return ''.encode('utf-8') def favicon(request):
with open('favicon.ico','rb') as f:
data=f.read()
return data def user_list(response):
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='root',
database='test' ) #不传参拿到是元组,传参之后得到的是字典
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute('select * from user')
user_list=cursor.fetchall()
print(user_list) #user_list列表[{'id':1,'name':yangzhizong,'password':123},{...}] #取到user_list.html模板
with open('templates/user_list.html','r',encoding='utf-8') as f:
data=f.read() #jinja2的应用,生成一个模板对象,需要传字符串
template=Template(data) #template是个对象,就是user_list.html
data=template.render(user_list=user_list) #调用对象的render方法,传入参数完成对html文件的渲染
return data.encode('utf-8')
待完善。。。
Django底层原理简介与安装的更多相关文章
- django工作原理简介
django工作原理简介 先简单的介绍一下django的工作原理,其中还会涉及到Middleware(中间件,包括request, view, exception, response),URLConf ...
- Neo4j图数据库简介和底层原理
现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...
- 【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期
一.Servlet简介 1.Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交 ...
- Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理 2017年01月04日 08:52:12 阅读数:18366 基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB ...
- 2、docker安装:内核要求、docker三要素、安装、helloworld、底层原理
1.前提说明 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 2.前提条件:内 ...
- Django简介及安装
Django简介及安装 我们都知道,Django是一种基于Python的Web开发框架. 那么,什么是Web开发?Web开发指的是开发基于B/S架构,通过前后端的配合,将后台服务器的数据在浏览器上展现 ...
- python框架Django简介与安装
Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...
- 细细品味Storm_Storm简介及安装
Storm是由专业数据分析公司BackType开发的一个分布式实时数据处理软件,可以简单.高效.可靠地处理大量的数据流.Twitter在2011年7月收购该公司,并于2011年9月底正式将Storm项 ...
- Nutch搜索引擎(第2期)_ Solr简介及安装
1.Solr简介 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化 ...
随机推荐
- PHP实现正态分布的累积概率函数
在实际项目中,遇到需要正态分布算法去计算一个数值在整体的分布区间,例如: 100,90,80,70,60,50,40,30,20,10共10个数,按从高到低的顺序排序,总数的10%分布区域为极高频, ...
- SQL Server 2012安装配置(Part3 )
SQL Server 2012安装配置(Part1 ) SQL Server 2012安装配置(Part2 ) SQL Server 2012安装配置(Part3 ) 3 客户端安装 3.1 安装客户 ...
- Git随笔:尝试将本地工程上传至Github上的repository仓库,构建远端与本地协同的Git环境
上传工程至自己的Github公开库,步骤如下: 第1步:建立本地 git 仓库,cd 到你的本地项目根目录下,执行 git init 命令: 第2步:将本地项目工作区的所有文件添加到暂存区.小数点 & ...
- linux下杀毒工具clamav
ClamAV 杀毒是Linux平台最受欢迎的杀毒软件,ClamAV属于免费开源产品,支持多种平台,如:Linux/Unix.MAC OS X.Windows.OpenVMS.ClamAV是基于病毒扫描 ...
- 用函数求lnx,lgx等
https://blog.csdn.net/liujian20150808/article/details/50628061
- JDBC操作数据库的详细步骤
1.注册驱动 告知JVM使用的是哪一个数据库的驱动 2.创建连接 使用JDBC中的类,完成对MySQL数据库的连接 3. 得到执行sql语句的Statement对象 通过连接对象获取对SQL语句的执行 ...
- Python自学笔记_
1. if语句 判断语句. 1 a=2 2 b=3 3 if a>b: 4 print("a>b") 5 else: 6 print("a<b" ...
- Golang 谷歌搜索api 实现搜索引擎(前端 bootstrap + jquery)
Golang 谷歌搜索api 实现搜索引擎(前端 bootstrap + jquery) 体验 冒号搜索 1. 获取谷歌搜索api 谷歌搜索api教程 2. 后台调用 程序入口 main.go // ...
- Unity基础-编辑器
编辑器 Special Folders Hidden Folder(start with .) Standard Assets:第一批加载的文件 Editor:只在编辑下才能使用, Plugins R ...
- 数据库储存session信息代码
今天给大家上一段代码,数据库存储session信息,你只需要将下面这段代码放到session文件中,然后再session_start()的地方引入sessiong文件就行啦,当然你就不用再写sessi ...