Skip to content

Commit d83b795

Browse files
committed
Add all files
1 parent 9831656 commit d83b795

File tree

403 files changed

+46525
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

403 files changed

+46525
-0
lines changed

.env

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
source /home/ubuntu/.virtualenvs/venv/bin/activate

Dockerfile

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
FROM ubuntu:16.04
2+
3+
MAINTAINER DongWeiming <[email protected]>
4+
ENV DEBIAN_FRONTEND noninteractive
5+
6+
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse\n\
7+
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse\n\
8+
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse\n\
9+
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse\n\
10+
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse\n\
11+
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse\n\
12+
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse\n\
13+
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse\n\
14+
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse\n\
15+
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse\n\
16+
' > /etc/apt/sources.list
17+
18+
RUN apt-get update
19+
RUN apt-get install python curl git zsh sudo -yq
20+
RUN useradd -ms /bin/bash ubuntu
21+
RUN echo "ubuntu ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
22+
RUN echo "ubuntu:ubuntu" | chpasswd
23+
USER ubuntu
24+
workdir /home/ubuntu
25+
RUN git clone https://github.com/dongweiming/web_develop
26+
RUN cd /home/ubuntu/web_develop
27+
28+
EXPOSE 9000 3141 22 5000

Vagrantfile

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# coding: utf-8
2+
Vagrant.configure(2) do |config|
3+
config.vm.box = "ubuntu/xenial64" # 设置box的名字
4+
config.vm.hostname = "WEB"
5+
# config.vm.synced_folder "/Users/dongweiming/web_develop", "/home/vagrant/web_develop"
6+
config.vm.network :forwarded_port, guest: 9000, host: 9000
7+
config.vm.network :forwarded_port, guest: 3141, host: 3141
8+
config.vm.network :forwarded_port, guest: 5000, host: 5000
9+
config.vm.provider "virtualbox" do |v|
10+
v.customize ["modifyvm", :id, "--name", "web_dev", "--memory", "1536"]
11+
end
12+
end

app.py

Whitespace-only changes.

chapter10/section2/__init__.py

Whitespace-only changes.

chapter10/section2/app.py

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# coding=utf-8
2+
import os
3+
4+
from werkzeug import SharedDataMiddleware
5+
from flask import abort, Flask, request, jsonify, redirect, send_file
6+
7+
from ext import db, mako, render_template
8+
from models import PasteFile
9+
from utils import get_file_path, humanize_bytes
10+
from client import create
11+
12+
ONE_MONTH = 60 * 60 * 24 * 30
13+
14+
app = Flask(__name__, template_folder='../../templates/r',
15+
static_folder='../../static')
16+
app.config.from_object('config')
17+
18+
app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
19+
'/i/': get_file_path()
20+
})
21+
22+
mako.init_app(app)
23+
db.init_app(app)
24+
25+
26+
@app.route('/r/<img_hash>')
27+
def rsize(img_hash):
28+
w = request.args['w']
29+
h = request.args['h']
30+
31+
old_paste = PasteFile.get_by_filehash(img_hash)
32+
new_paste = PasteFile.rsize(old_paste, w, h)
33+
34+
return new_paste.url_i
35+
36+
37+
@app.route('/d/<filehash>', methods=['GET'])
38+
def download(filehash):
39+
paste_file = PasteFile.get_by_filehash(filehash)
40+
41+
return send_file(open(paste_file.path, 'rb'),
42+
mimetype='application/octet-stream',
43+
cache_timeout=ONE_MONTH,
44+
as_attachment=True,
45+
attachment_filename=paste_file.filename.encode('utf-8'))
46+
47+
48+
@app.route('/', methods=['GET', 'POST'])
49+
def index():
50+
if request.method == 'POST':
51+
uploaded_file = request.files['file']
52+
w = request.form.get('w')
53+
h = request.form.get('h')
54+
if not uploaded_file:
55+
return abort(400)
56+
57+
rs = create(uploaded_file, width=w, height=h)
58+
if rs['r']:
59+
return rs['error']
60+
61+
paste_file = rs['paste_file']
62+
63+
return jsonify({
64+
'url_d': paste_file.url_d % request.host,
65+
'url_i': paste_file.url_i % request.host,
66+
'url_s': paste_file.url_s % request.host,
67+
'url_p': paste_file.url_p % request.host,
68+
'filename': paste_file.filename,
69+
'size': humanize_bytes(paste_file.size),
70+
'uploadtime': paste_file.uploadtime,
71+
'type': paste_file.type,
72+
'quoteurl': paste_file.quoteurl.replace('%25s', request.host)
73+
})
74+
75+
return render_template('index.html', **locals())
76+
77+
78+
@app.after_request
79+
def after_request(response):
80+
response.headers['Access-Control-Allow-Origin'] = '*'
81+
response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
82+
return response
83+
84+
85+
@app.route('/j', methods=['POST'])
86+
def j():
87+
uploaded_file = request.files['file']
88+
89+
if uploaded_file:
90+
rs = create(uploaded_file)
91+
if rs['r']:
92+
return rs['error']
93+
94+
paste_file = rs['paste_file']
95+
96+
width, height = paste_file.image_size
97+
98+
return jsonify({
99+
'url': paste_file.url_i,
100+
'short_url': paste_file.url_s,
101+
'origin_filename': paste_file.filename,
102+
'hash': paste_file.filehash,
103+
'width': width,
104+
'height': height
105+
})
106+
107+
return abort(400)
108+
109+
110+
@app.route('/p/<filehash>')
111+
def preview(filehash):
112+
paste_file = PasteFile.get_by_filehash(filehash)
113+
114+
if not paste_file:
115+
filepath = get_file_path(filehash)
116+
if not(os.path.exists(filepath) and (not os.path.islink(filepath))):
117+
return abort(404)
118+
119+
paste_file = PasteFile.create_by_old_paste(filehash)
120+
db.session.add(paste_file)
121+
db.session.commit()
122+
123+
return render_template('success.html', p=paste_file)
124+
125+
126+
@app.route('/s/<symlink>')
127+
def s(symlink):
128+
paste_file = PasteFile.get_by_symlink(symlink)
129+
130+
return redirect(paste_file.url_p)
131+
132+
133+
if __name__ == '__main__':
134+
app.run(host='0.0.0.0', port=9000)

chapter10/section2/calc.thrift

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
service CalcService {
2+
i64 add(1:i64 a, 2:i64 b),
3+
}

chapter10/section2/client.py

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# coding=utf-8
2+
import sys
3+
4+
sys.path.append('gen-py')
5+
sys.path.insert(0, '/usr/lib/python2.7/site-packages')
6+
7+
from thrift.transport import TTransport, TSocket
8+
from thrift.protocol import TBinaryProtocol
9+
10+
from pastefile import PasteFileService
11+
from pastefile.ttypes import (
12+
PasteFile, CreatePasteFileRequest, UploadImageError,
13+
NotFound)
14+
15+
from werkzeug.local import LocalProxy
16+
17+
18+
def get_client():
19+
transport = TSocket.TSocket('localhost', 8200)
20+
transport = TTransport.TBufferedTransport(transport)
21+
protocol = TBinaryProtocol.TBinaryProtocol(transport)
22+
client = PasteFileService.Client(protocol)
23+
transport.open()
24+
return client
25+
26+
client = LocalProxy(get_client)
27+
28+
29+
def create(uploaded_file, width=None, height=None):
30+
filename = uploaded_file.filename.encode('utf-8')
31+
mimetype = uploaded_file.mimetype.encode('utf-8')
32+
filehash, path = client.get_file_info(filename, mimetype)
33+
34+
create_request = CreatePasteFileRequest()
35+
36+
create_request.filename = filename
37+
create_request.mimetype = mimetype
38+
create_request.filehash = filehash
39+
40+
uploaded_file.save(path)
41+
if width is not None and height is not None:
42+
create_request.width = width
43+
create_request.height = height
44+
try:
45+
pastefile = client.create(create_request)
46+
except UploadImageError:
47+
return {'r': 1, 'error': 'upload fail'}
48+
49+
print isinstance(pastefile, PasteFile)
50+
51+
try:
52+
paste_file = client.get(pastefile.id)
53+
except NotFound:
54+
return {'r': 1, 'error': 'not found'}
55+
56+
return {'r': 0, 'paste_file': paste_file}
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# coding=utf-8
2+
import os
3+
4+
import thriftpy
5+
from thriftpy.rpc import client_context
6+
from thriftpy.protocol import TBinaryProtocolFactory
7+
from thriftpy.transport import TBufferedTransportFactory
8+
9+
HERE = os.path.abspath(os.path.dirname(__file__))
10+
11+
calc_thrift = thriftpy.load(
12+
os.path.join(HERE, 'calc.thrift'),
13+
module_name='calc_thrift')
14+
15+
with client_context(calc_thrift.CalcService,
16+
'127.0.0.1', 8300,
17+
proto_factory=TBinaryProtocolFactory(),
18+
trans_factory=TBufferedTransportFactory(),
19+
timeout=None) as calc:
20+
rs = calc.add(1, 2)
21+
print 'Result is: {}'.format(rs)

chapter10/section2/config.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# coding=utf-8
2+
DEBUG = True
3+
SQLALCHEMY_DATABASE_URI = 'mysql://web:web@localhost:3306/r'
4+
UPLOAD_FOLDER = '/tmp/permdir'
5+
SQLALCHEMY_TRACK_MODIFICATIONS = False

chapter10/section2/ext.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# coding=utf-8
2+
from flask_mako import MakoTemplates, render_template # noqa
3+
from flask_sqlalchemy import SQLAlchemy
4+
5+
mako = MakoTemplates()
6+
db = SQLAlchemy()

chapter10/section2/gen-py/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#!/usr/bin/env python
2+
#
3+
# Autogenerated by Thrift Compiler (0.9.3)
4+
#
5+
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
6+
#
7+
# options string: py
8+
#
9+
10+
import sys
11+
import pprint
12+
from urlparse import urlparse
13+
from thrift.transport import TTransport
14+
from thrift.transport import TSocket
15+
from thrift.transport import TSSLSocket
16+
from thrift.transport import THttpClient
17+
from thrift.protocol import TBinaryProtocol
18+
19+
from pastefile import PasteFileService
20+
from pastefile.ttypes import *
21+
22+
if len(sys.argv) <= 1 or sys.argv[1] == '--help':
23+
print('')
24+
print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] function [arg1 [arg2...]]')
25+
print('')
26+
print('Functions:')
27+
print(' PasteFile get(i32 pid)')
28+
print(' get_file_info(string filename, string mimetype)')
29+
print(' PasteFile create(CreatePasteFileRequest request)')
30+
print('')
31+
sys.exit(0)
32+
33+
pp = pprint.PrettyPrinter(indent = 2)
34+
host = 'localhost'
35+
port = 9090
36+
uri = ''
37+
framed = False
38+
ssl = False
39+
http = False
40+
argi = 1
41+
42+
if sys.argv[argi] == '-h':
43+
parts = sys.argv[argi+1].split(':')
44+
host = parts[0]
45+
if len(parts) > 1:
46+
port = int(parts[1])
47+
argi += 2
48+
49+
if sys.argv[argi] == '-u':
50+
url = urlparse(sys.argv[argi+1])
51+
parts = url[1].split(':')
52+
host = parts[0]
53+
if len(parts) > 1:
54+
port = int(parts[1])
55+
else:
56+
port = 80
57+
uri = url[2]
58+
if url[4]:
59+
uri += '?%s' % url[4]
60+
http = True
61+
argi += 2
62+
63+
if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
64+
framed = True
65+
argi += 1
66+
67+
if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
68+
ssl = True
69+
argi += 1
70+
71+
cmd = sys.argv[argi]
72+
args = sys.argv[argi+1:]
73+
74+
if http:
75+
transport = THttpClient.THttpClient(host, port, uri)
76+
else:
77+
socket = TSSLSocket.TSSLSocket(host, port, validate=False) if ssl else TSocket.TSocket(host, port)
78+
if framed:
79+
transport = TTransport.TFramedTransport(socket)
80+
else:
81+
transport = TTransport.TBufferedTransport(socket)
82+
protocol = TBinaryProtocol.TBinaryProtocol(transport)
83+
client = PasteFileService.Client(protocol)
84+
transport.open()
85+
86+
if cmd == 'get':
87+
if len(args) != 1:
88+
print('get requires 1 args')
89+
sys.exit(1)
90+
pp.pprint(client.get(eval(args[0]),))
91+
92+
elif cmd == 'get_file_info':
93+
if len(args) != 2:
94+
print('get_file_info requires 2 args')
95+
sys.exit(1)
96+
pp.pprint(client.get_file_info(args[0],args[1],))
97+
98+
elif cmd == 'create':
99+
if len(args) != 1:
100+
print('create requires 1 args')
101+
sys.exit(1)
102+
pp.pprint(client.create(eval(args[0]),))
103+
104+
else:
105+
print('Unrecognized method %s' % cmd)
106+
sys.exit(1)
107+
108+
transport.close()

0 commit comments

Comments
 (0)