Django的学习需要掌握的一些基础和初步搭建自己的框架
2024-10-21 03:49:33
一.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
最新文章
- ArrayList LinkedList源码解析
- 客户有两台windows服务器要做sql server双机切换
- Can&#39;t find PHP headers in /usr/include/php
- iOS NSTimer使用详解 开启、关闭、移除
- oracle数据库常用语句
- OnItemSelectedListener事件与二级联动
- 获取腾讯soso地图坐标代码
- Go - method
- (BCB)C++ Builder 6.0在Win7下如何使用帮助Help
- 微信小程序点击返回顶层实现方法
- 收集—— css实现垂直居中
- File文件的读写操作RandomAccessFile类
- P1742 最小圆覆盖(计算几何)
- HBase、MongoDB、cassandra比较
- sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)
- golang中数组与切片的区别
- idea创建springcloud项目图文教程(EurekaServer注册中心)
- linux shell if语句使用方法
- MNIST手写数字识别 Tensorflow实现
- 一般处理程序、ASP.NET核心知识(5)