Django使用S3服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django使用S3服务相关的知识,希望对你有一定的参考价值。

参考技术A

static静态文件和media多媒体(多为用户上传)需要分目录存储,新建s3utils.py文件:

settings.py添加S3配置:

因为S3开放了本机访问权限,因为不需要认证。

需要认证的添加 KEY_ID 和ACCESS_KEY:

运行 collectstaticDjango管理命令 :

静态文件应该以 http://horoscope-cxclient.s3.amazonaws.com/static/ 为结尾。

任何上传的文件FileField或ImageField模型上的属性都应该在 http://horoscope-cxclient.s3.amazonaws.com/media/ 中。如果这些模型属性指定upload_to路径,则存储于 /media/*** 。

如上配置配置成功后,资源访问域名是 https://horoscope-cxclient.s3.amazonaws.com/media/

发现资源加载速度慢了很多,17K耗时将近两秒,而且不同区域访问不稳定。

此时就应该祭出CDN了 知乎CDN

CDN HOST: http://***.cloudfront.net/ ,解析至 http://static.mobileapp666.com 域名下,settings配置:

重启后资源通过 http://static.mobileapp666.com/** 访问,速度有了明显的提高。

AWS_S3_SECURE_URLS: 是否启动安全网址,即是否使用 https , 默认为True,因为https需要申请证书等等一系列处理,暂时设置为False后将使用 http 协议。

使用 staticfiles

常用命令:

上传目录 需要添加参数 --recursive

AWS CLI命令参考: AWS CLI Command Reference

参考:

django-s3-temporary

cname-support-aws_s3_custom_domain-doesnt

django-wont-serve-static-files-from-amazon-s3-with-custom-domain

Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files

django

---恢复内容开始---

首先了解web应用

一.

web应用是通过web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要一个浏览器,应用程序分为两种 C/S B/S  ,c/s是客户端/服务器程序,这类程序一般独立运行, b/s 是浏览器/服务器端应用程序,,浏览器是一个socket客户端,服务器是一个socket服务端

web应用小程序

技术分享图片
 1 import socket
 2 
 3 def handle_request(client):
 4     #5.接收浏览器的信息,1024字节接收 
 5     request_data = client.recv(1024)
 6     print("request_data: ",request_data)
 7     # 5.发送响应协议
 8     client.send("HTTP/1.1 200 OK
status: 200
Content-Type:text/html

".encode("utf8"))
 9     # 6.发送数据至浏览器(客户端)
10     client.send("<h1>Hello, luffycity!</h1><img src=‘‘>".encode("utf8"))
11 
12 def main():
13     # 1.创建socket对象 socket.socket()
14     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
15     # 2.绑定ip端口
16     sock.bind((localhost,8812))
17     # 3.限制次数
18     sock.listen(5)
19 
20     while True:
21         print("the server is waiting for client-connection....")
22         # 4.connection 相当于连接的那把伞,地址
23         connection, address = sock.accept()
24         handle_request(connection)
25         connection.close()
26 
27 if __name__ == __main__:
28 
29     main()
web

关于响应协议:

           请求协议
浏览器-------------------> 服务器
<-------------------
响应协议

由服务端发送给浏览器的一种特殊协议,双方规定好的,
格式:
响应首行
HTTP/1.1 200 OK
协议/版本号/状态码/状态码译文
响应头
status: 200
Content-Type:text/html
键值对 用 区分开
响应体

<h1>Hello, luffycity!</h1>
主要内容 有 区分

了解http协议
二.
http是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。
HTTP 协议特性
1.基于TCP/IP:
http协议是基于TCP/IP协议之上的应用层协议。
2.基于请求-响应模式:
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应
3.无状态保存
比如打开一个网页的时候,协议会稍微停留几秒钟,方便快速进行下次访问
4.无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

请求协议
get与post请求方法不同
  • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
  • GET与POST请求在服务端获取请求数据方式不同。

技术分享图片

响应协议:

 


技术分享图片

关于web框架

 三

wsgiref模块

最简单的web应用是把html用文件保存好,用一个现成的http服务器软件,接受用户的请求,从文件读取html,返回,要生成动态的html文件,需要把上述步骤自己实现,太麻烦了,需要自己去写,TCP连接(socket模块),解析http请求(接收来自http的协议),发送htto响应(发送响应协议),浏览器和服务器是通过http协议进行通信的,需要一个接口协议实现服务器软件,这个接口就是wsgi,而wsgiref就是python基于wsgi协议开发的服务模块

技术分享图片
 1 from wsgiref.simple_server import make_server
 2 
 3 def application(environ, start_response):
 4     """
 5 
 6     :param environ: 请求信息字典
 7     :param start_response: 封装响应格式的
 8     :return:
 9     """
10     print("environ",environ)
11     print("PATH_INFO",environ.get("PATH_INFO"))
12     start_response(200 OK, [(Content-Type, text/html),("k1","v1")])
13     return [b<h1>Hello, web!</h1>]
14 
15 
16 httpd = make_server(‘‘, 8080, application)
17 
18 print(Serving HTTP on port 8080...)
19 # 开始监听HTTP请求:
20 httpd.serve_forever()
wsgiref模块

environ: 将http协议的各种请求以字典的的形式返回,直接取字典的键值对,

关于web框架的小小小项目

技术分享图片

 

 web项目中,templates是用来存放html文件的文件夹

manage.py是用来通过wsgief模块,进行动态的http协议交互

技术分享图片
 1 # 引入wsgi模块
 2 from wsgiref.simple_server import make_server
 3 
 4 from urls import urlpattens
 5 
 6 def application(environ, start_response):
 7 
 8     print("environ",environ)
 9     print("PATH_INFO",environ.get("PATH_INFO"))
10     path=environ.get("PATH_INFO")
11     data=b""
12 
13 
14     # 方案1
15     # if path=="/login":
16     #     data=login(environ)
17     # elif path=="/auth":
18     #     data=auth(environ)
19 
20     # 方案2
21     func=None
22     # 2.1遍历取到的路径 如("/timer", timer),如果path=/time func为timer
23     for item in urlpattens:
24         print("------>",item[0])
25         if item[0]==path:
26             func=item[1]
27             break
28     # 2.2 如果func为空,data= 404 如果不为空,执行timer(environ)函数
29     if not func:
30         data=b"<h1>404</h1>"
31     else:
32         data = func(environ)
33 
34     start_response(200 OK, [(Content-Type, text/html)])
35     # 3.给浏览器返回
36     return [data]
37 
38 
39 httpd = make_server(‘‘, 8088, application)
40 
41 print(Serving HTTP on port 8088...)
42 # 开始监听HTTP请求:
43 httpd.serve_forever()
manage文件

 

models.py 是用来与数据库打交道的

技术分享图片
 1 # 创建表结构
 2 
 3 import pymysql
 4 #连接数据库
 5 conn = pymysql.connect(host=127.0.0.1,port= 3306,user = root,passwd=‘‘,db=web) #db:库名
 6 #创建游标
 7 cur = conn.cursor()
 8 
 9 sql=‘‘‘
10 create table userinfo(
11         id INT PRIMARY KEY ,
12         name VARCHAR(32) ,
13         password VARCHAR(32)
14 )
15 
16 ‘‘‘
17 
18 cur.execute(sql)
19 
20 #提交
21 conn.commit()
22 #关闭指针对象
23 cur.close()
24 #关闭连接对象
25 conn.close()
model文件

 

urls.py 是用来进行对views.py导入的,用来存放访问的请求转到manage,在找到相应的关系执行函数

技术分享图片
 1 # url与视图函数的映射关系
 2 from views import login,auth,fav,index,timer
 3 
 4 urlpattens = [
 5     ("/timer", timer),
 6     ("/login", login),
 7     ("/auth", auth),
 8     ("/favicon.ico", fav),
 9     ("/", index),
10 ]
urls文件

 

views.py 是用来进行对浏览器端返回的信息进行函数的方法结果返回给manage,最后返回到浏览器

技术分享图片
 1 from urllib.parse import parse_qs
 2 
 3 def login(environ):
 4     with open("templates/login.html", "rb") as f:
 5         data = f.read()
 6 
 7     return data
 8 
 9 def auth(environ):
10     # 登录认证
11 
12     # 1 获取用户输入的用户名和密码
13     # 1.1获取接受的字节数
14     request_body_size = int(environ.get(CONTENT_LENGTH, 0))
15     print("request_body_size", request_body_size)  # 17
16     # 1.2 按照字节数获取
17     request_body = environ[wsgi.input].read(request_body_size)  # b‘user=alex&pwd=123‘
18     # 1.3 将账号密码装换成字典的形式
19     reqeust_data = parse_qs(request_body)  # {b‘user‘: [b‘alex‘], b‘pwd‘: [b‘123‘]}
20     # 1.4  用get取出字典,转换成字符串
21     user = (reqeust_data.get(b"user")[0]).decode("utf8")
22     pwd = (reqeust_data.get(b"pwd")[0]).decode("utf8")
23     print("====>", user, pwd)
24 
25     # 2 去数据库做校验,查看提交用户是否合法
26     # 连接数据库
27     import pymysql
28     conn = pymysql.connect(host=127.0.0.1, port=3306, user=root, passwd=‘‘, db=web)  # db:库名
29     # 创建游标
30     cur = conn.cursor()
31     SQL = "select * from userinfo WHERE NAME =‘%s‘ AND PASSWORD =‘%s‘" % (user, pwd)
32     cur.execute(SQL)
33     # print("cur.fetchone:",cur.fetchone()) # (1, ‘alex‘, ‘123‘)
34     if cur.fetchone():
35         # 验证成功
36         data = "登录成功!".encode("gbk")
37     else:
38         # 验证失败
39         data = "登录失败!".encode("gbk")
40 
41     return data
42 
43 
44 def fav(environ):
45 
46     with open("templates/favicon.ico","rb") as f:
47         data=f.read()
48 
49     return data
50 
51 
52 def index(environ):
53 
54     with open("templates/index.html", "rb") as f:
55         data = f.read()
56 
57     return data
58 
59 def timer(environ):
60 
61     import datetime
62     now=datetime.datetime.now()
63 
64     return str(now).encode("utf8")
views文件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


























 

---恢复内容结束---



















































以上是关于Django使用S3服务的主要内容,如果未能解决你的问题,请参考以下文章

设置 Django 以提供来自 Amazon S3 的媒体文件

使用 s3 和 django-storages 并上传图片

本地文件系统作为 Django 中的远程存储

使用 AWS S3 for django 在 heroku 上提供静态文件?

aws、django、unicorn 和 s3 - 那我需要 nginx 吗?

使用 Amazon S3 静态存储进行静态加载的 django-cms_text_ckeditor 错误