Django的学习需要掌握的一些基础和初步搭建自己的框架
一.Django的学习需要掌握的一些基础
第一个需要注意的点:客户端发送过来的数据结构组成:
第二个需要注意的点:动态网页和静态网页
静态网页:用户发送请求,服务端找到对应的静态文件返回给浏览器,静态网页时不变的,用户恮什么就返回什么,不能和用户交互。
动态网页:动态网页和静态网页的区别就是动态网页能和用户进行交互,根据用户的需求随时调换不同的静态页面返回给浏览器。
疑问:1.wsgiref怎么把套接字封装的?
WSGI_APPLICATION = 'untitled7.wsgi.application'
wsgiref是把socket封装起来,不用再去手动生成。
2.make_server()和serve_forever()
3.ico图标的问题
请求头最后的\r\n是标识着请求头的结束,请求体即将开始。我的理解是两个\r\n是他们中间空一格,两次换行,开启请求体内容输出,更好的区分头和体。
import socket
# 客户端和服务端的传输:套接字通信
soc=socket.socket()
# 绑定的是元组
soc.bind(('127.0.0.1',8001))
soc.listen(5) # 通信循环
while True:
print('监听8001端口')
# addr是客户端的IP+Port
#conn是建双向连接对象,soc是套接字对象
conn,addr=soc.accept()
# 接收到的客户端数据
data=conn.recv(1024)
# 转换成str类型
# str()函数里面第一个参数是需要转的数据,第二个是指定的字符编码类型。下面是将二进制转成字符串
data=str(data,encoding='utf-8')
print(data)
# 我们打印获得的字符串,发现客户端发送过来的数据之间是按照'\r\n'有规律的分开的,待会再说分开有何意义。
# 我们可以将这些数据按照发现的规律用split分割开来,返回一个有一定规律的列表。
# 取出列表第一个,再把他们通过空格分开来,返回一个请求首行组成的列表。
resquest_list=data.split('\r\n')
first_list=resquest_list[0].split(' ')
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')
if first_list[1]=='/index': # 如果请求首行第二个元素(也就是请求地址)等于'/index'
# conn.send('<h1>index</h1><img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=775f519ac08065386fe7ac41f6b4ca21/fd039245d688d43f63d84526771ed21b0ff43bf5.jpg">'.encode('utf-8'))
with open('index.html','rb')as f:
data=f.read()
conn.send(data) # 将服务端的数据发送给浏览器,浏览器对数据进行渲染=====》静态网页 数据写死了
elif first_list[1]=='/two':
with open('two.html','r',encoding='utf-8')as f:
data=f.read()
import datetime
now=datetime.datetime.now().strftime('%Y-%m-%d %X')
data=data.replace('@@time@@',now) # ======》动态网页 网页数据没有固定死
conn.send(data.encode('utf-8'))
else:
conn.send(b'') # print(data)
#
# conn.send(b'HTTP/1.1 200 OK \r\n\r\nhello web')
conn.close() '''
# 请求首行:请求类型 请求地址 请求协议
GET /index HTTP/1.1\r\n
# 请求头
Host: 127.0.0.1:8001\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n\r\n' # 请求体
。。。。 '''
基础知识点-一个简单的请求与回响
请求---》处理---》调用函数---》打开模板和数据库---》返回数据给浏览器---》浏览器解析渲染
下面分三个文件来说明:
用wsgiref搭建简单的服务端
from wsgiref.simple_server import make_server
import my_urls
from views import * def my_server(environ, start_response):
# print(environ) environ返回的是一个字典,path_info是字典里的key,对应的值是请求地址
print(environ['PATH_INFO']) # 'PATH_INFO': '/index' PATH_INFO就是请求地址
start_response('200 OK', [('Content-Type', 'text/html')]) # 服务器响应状态码:200 文本类型:text
func=None
for url in my_urls.urls:
if url[0]==environ['PATH_INFO']:
func=url[1] # 这里的func是函数地址
break # 结束循环
if func:
# 固定写法,如果不写environ也可以,但是要求函数必须也不能有形参
# 不写的话报错:missing 1 required positional argument: 'response'
response=func(environ)
else:
response= error(environ) return [response,] # 这里是固定返回一个列表,用别人的就要按照别人的要求来 if __name__ == '__main__': my=make_server('127.0.0.1',8002,my_server)
my.serve_forever()
搭建简单服务器
视图函数
用到jinja2模块中的template
# 视图函数
import pymysql
from jinja2 import Template
def index(response):
with open('templates/index.html','r',encoding='utf-8') as f:
data=f.read() return data.encode('utf-8') def time(response):
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 user_list(response):
# 连接数据库拿数据
# 拿到一个数据库连接
conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',database='test',password='egon123')
# 拿到一个游标对象
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行sql
cursor.execute('select * from user')
# 把数据拿出来
user_list=cursor.fetchall()
print(user_list)
with open('templates/user_list.html','r',encoding='utf-8')as f:
data=f.read()
# 生成一个模板对象,需要传字符串
template=Template(data)
# 相当于在执行data.replace(),返回替换完成的字符串
data=template.render(user_list=user_list) return data.encode('utf-8')
def error(request):
return ''.encode('utf-8') def favicon(request):
with open('favicon.ico','rb') as f:
data=f.read()
return data
视图函数
路由:路由的作用就是建立请求地址与索引之间的关系--》服务端解析出请求地址,然后调用对应的函数
import views
# 路由
urls=[
('/index',views.index),
('/time',views.time),
('/user_list',views.user_list),
('/favicon.ico',views.favicon),
]
路由
下面是三个模板中的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=775f519ac08065386fe7ac41f6b4ca21/fd039245d688d43f63d84526771ed21b0ff43bf5.jpg">' </body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
@@time@@
</body>
</html>
two.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
</head>
<body>
<table border="1">
<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>
user_list.html
放一张简单的django工作图
附上文字说明:
图片解析:浏览器向服务器发送url地址:ip+port+请求地址 ,服务端对请求地址进行解析,获得客户端发来的请求地址,然后
通过路由循环服务端的请求地址,有匹配成功的就调用服务端的函数,函数从模板templates中调用html文件,如果需要从数据库
调用数据则需要导入pymysql,获得的数据列表最后需要通过模板对象进行渲染,浏览器客户端解析html,并对模板按照要求进行
相应的渲染。 很形象的一个流程图
二.初步搭建自己的框架 1.安装django的三种方式
方式二
方式三
2.如何创建自己的django项目?
1.首先切换到一个放项目的目录下
2.在命令行输入:
django-admin startproject django项目名 3.切换到项目目录,启动manage文件 python3 manage.py runserver 可以通过端口+ip查看自己的django项目 3.如何在pycharm里启动Django?
3.1 直接在新窗口打开django所在位置
terminal运行python3 manage.py runserver
Django的学习需要掌握的一些基础和初步搭建自己的框架的更多相关文章
- Django搭配Celery进行异步/定时任务(一)初步搭建
以下需求场景很常见: 1. 用户点击页面按钮,请求后台进行一系列耗时非常高的操作,页面没有响应/一直Loading,用户体验非常不好. 2. 某些数据需要预先处理,每天凌晨的时候进行运算,大约半小时到 ...
- Java开发学习心得(一):SSM环境搭建
目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...
- Django初识 学习笔记一
Django初识 学习笔记一 mvcviewsmodelstemplate. 一 MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(c ...
- Django:学习笔记(9)——视图
Django:学习笔记(9)——视图 基础视图 基于函数的视图,我们需要在使用条件语句来判断请求类型,并分支处理.但是在基于类的视图中,我们可以在类中定义不同请求类型的方法来处理相对应的请求. 基于函 ...
- Django:学习笔记(4)——请求与响应
Django:学习笔记(4)——请求与响应 0.URL路由基础 Web应用中,用户通过不同URL链接访问我们提供的服务,其中首先经过的是一个URL调度器,它类似于SpringBoot中的前端控制器. ...
- Django:学习笔记(2)——创建第一个应用
Django:学习笔记(2)——创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...
- 学习 shell脚本之前的基础知识
转载自:http://www.92csz.com/study/linux/12.htm 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...
- Django快速学习搭建blog项目
新手学习Django,本文学习的文档是<Django Web开发指南>.好了我也是新手,没什么好说了,go!- 首先先确定环境,我是在linux(Ubuntu14.04 gnome)下. ...
- 四、Android学习第四天——JAVA基础回顾(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...
随机推荐
- HDU2147 kiki's game (SG表找规律)
Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes th ...
- 表单提交Post方法、Get方法
表单用来接受用户的输入,并将用户的输入以“name=value值对”集合的形式提交到服务器进行处理.那么表单是怎样将数据提交到服务器的?服务器是怎样对表单数据进行处理的?下面我将为大家揭开表单提交背 ...
- 获取当前正在运行的activity
adb shell dumpsys activity activities | findstr "Run"
- zookeeper分布式安装
1.先把zookeeper-3.5.2-alpha.tar上传解压到/usr/local/下重命名为zookeeper ############# zookeeper env ############ ...
- SQL编程题-----1
首先,题目给出这个数据库表格 要求写出SQL语句使之变成如下表格 解决方法: SELECT t1.Rq,t1.胜,t2.负 FROM //t1和t2是自己命的新表格的名字 (SELEC ...
- vim vi Ubuntu 设置
1. 在vi编辑模式下按退格键不能删除内容,按方向键不能上下左右移动?如果是则:一 在vi里非编辑模式下按冒号进入到末行命令模式,然后输入set nocompatible,回车,然后在进入vi编辑模式 ...
- 1.oracle中decode的一些巧妙用法
1.符号函数sign在decode中的用法--比较大小 select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0 ...
- linq Foreach
lst.ForEach(item => { CbxDF1VersionItemSource.Add(item); });
- Weekly Contest 78-------->809. Expressive Words (stack)
Sometimes people repeat letters to represent extra feeling, such as "hello" -> "he ...
- POJ3264 【RMQ基础题—ST-线段树】
ST算法Code: //#include<bits/stdc++.h> #include<cstdio> #include<math.h> #include< ...