Commit d7920f22 authored by YONGLIN SU's avatar YONGLIN SU

基礎模板

parents
Pipeline #13 failed with stages
FROM julianassmann/opencv-cuda:cuda-10.2-opencv-4.3
RUN apt update
RUN apt install -y supervisor
RUN apt install -y nginx
RUN apt install -y python3-dev python3-pip
RUN apt clean && apt autoclean && apt autoremove
RUN pip3 install uwsgi
RUN pip3 install flask
RUN pip3 install flask-api
RUN pip3 install flask-cors
RUN pip3 install flask-mysql
RUN pip3 install flask-restful
RUN pip3 install flask-restful-swagger-2
RUN pip3 install flask_sqlalchemy
RUN pip3 install passlib
RUN pip3 install requests
RUN pip3 install pandas xlsxwriter
RUN pip3 install pillow
# RUN pip3 install opencv-python-headless
# RUN pip3 install opencv-contrib-python-headless
RUN pip3 install jupyter
# 修正jupyter hight light無法顯示錯誤
RUN pip3 install jedi==0.17.2
RUN pip3 install matplotlib
RUN pip3 install flask-socketio
RUN pip3 install Flask-APScheduler
RUN pip3 install python-docx
RUN pip3 install xlrd
RUN mkdir /log
WORKDIR /app
EXPOSE 8000
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 TZ=Asia/Taipei
CMD ["jupyter", "notebook", "--allow-root", "--ip=0.0.0.0"]
# CMD ["/usr/bin/supervisord"]
version: "2"
services:
flask:
build: .
ports:
- "5000:8000"
- "8888:8888"
environment:
- MYSQL_HOST=mysql
- MYSQL_PORT=3306
- MYSQL_USR=root
- MYSQL_PWD=123456
- MYSQL_DB=ecom
volumes:
- "./notebook:/app"
- "./supervisord.conf:/etc/supervisor/conf.d/supervisord.conf"
- "./nginx.conf:/etc/nginx/sites-available/default"
- "./uwsgi.ini:/etc/uwsgi.ini"
links:
- mysql
restart: always
network_mode: "bridge"
container_name: "TicketRecognitionApiDev"
mysql:
image: mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- "mysql_data:/var/lib/mysql"
restart: always
network_mode: "bridge"
container_name: "TicketRecognitionMysqlDev"
volumes:
mysql_data:
server {
listen 8000;
server_name localhost;
charset utf-8;
access_log /log/nginx_access.log;
error_log /log/nginx_error.log;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/var/uwsgi.sock;
}
}
{
"cells": [
{
"cell_type": "markdown",
"id": "3fd2bff2",
"metadata": {},
"source": [
"# main"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ff92442b",
"metadata": {},
"outputs": [],
"source": [
"from flask import Flask\n",
"from flask_sqlalchemy import SQLAlchemy"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6ba76e27",
"metadata": {},
"outputs": [],
"source": [
"app = Flask(__name__)\n",
"# 設定資料庫位置,並建立 app\n",
"app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True\n",
"# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'\n",
"app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@TicketRecognitionMysqlDev:3306/ecom'\n",
"db = SQLAlchemy(app)"
]
},
{
"cell_type": "markdown",
"id": "394fef14",
"metadata": {},
"source": [
"# models"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "97103bae",
"metadata": {},
"outputs": [],
"source": [
"class Users(db.Model):\n",
" _id = db.Column('id', db.Integer, primary_key=True,)\n",
" name = db.Column('name', db.String(100))\n",
" email = db.Column(db.String(100))\n",
" def __init__(self, name, email):\n",
" self.name =name\n",
" self.email = email"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "62ac7881",
"metadata": {},
"outputs": [],
"source": [
"user = Users(name = \"Allen\", email = \"pp93189tw@gmail.com\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f6a7fe38",
"metadata": {},
"outputs": [],
"source": [
"db.session.add(user)\n",
"db.session.commit()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d830ad5d",
"metadata": {},
"outputs": [],
"source": [
"db.create_all()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c6a7ce05",
"metadata": {},
"outputs": [],
"source": [
"users = db.session.query(Users).all()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "af8ede9e",
"metadata": {},
"outputs": [],
"source": [
"db."
]
},
{
"cell_type": "markdown",
"id": "02e879fa",
"metadata": {},
"source": [
"# import test db"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c9853d02",
"metadata": {},
"outputs": [],
"source": [
"import sys,os\n",
"sys.path.append(os.path.join('./', 'models'))\n",
"\n",
"from UserModel import Users,db"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e3c2f0a1",
"metadata": {},
"outputs": [],
"source": [
"users = db.session.query(Users).all()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d84f0747",
"metadata": {},
"outputs": [],
"source": [
"new_user = Users(name=\"name\",account=\"account\",password=\"password\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c06e54db",
"metadata": {},
"outputs": [],
"source": [
"r = db.session.query(Users).filter_by(account=\"allen\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d3f4911c",
"metadata": {},
"outputs": [],
"source": [
"r.count()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "de1e949d",
"metadata": {},
"outputs": [],
"source": [
"db.session.add(new_user)\n",
"db.session.commit()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "385e1411",
"metadata": {},
"outputs": [],
"source": [
"db.session.refresh(new_user).account"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ee372ba4",
"metadata": {},
"outputs": [],
"source": [
"new_user._id"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ca474d63",
"metadata": {},
"outputs": [],
"source": [
"users = db.session.query(Users).all()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3ad5e461",
"metadata": {},
"outputs": [],
"source": [
"for a in users:\n",
" print(a)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "210a3e09",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "b5d1471f",
"metadata": {},
"outputs": [],
"source": [
"import flask"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6ce11d76",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
#!/usr/bin/env python
# NOTE: Run with PYTHONPATH=. python example/app.py
from flask import Flask,session
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
from flask_restful_swagger_2 import Api, swagger
from datetime import timedelta
app = Flask(__name__)
# 設置session SECRET_KEY
app.config['SECRET_KEY'] = "Ecom84253675"
# 設置session life time
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=1)
CORS(app)
api = Api(app, api_version='0.1', api_spec_url='/api/swagger')
# 設定資料庫位置,並建立 app
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@TicketRecognitionMysqlDev:3306/ecom'
db = SQLAlchemy(app)
def auth(api_key, endpoint, method):
# Space for your fancy authentication. Return True if access is granted, otherwise False
print(api_key, endpoint, method)
if('login' in endpoint):
return True
if(session.get('account') is None):
return False
else:
return True
if __name__ == '__main__':
import os, sys
sys.path.append(os.path.join('./', 'resources'))
from UserResource import GetAllUsers,GetUser,CreateUser,DeleteUser,UpdateUser,UserLogin,UserLogout
swagger.auth = auth
api.add_resource(GetAllUsers, '/api/users')
api.add_resource(GetUser, '/api/user/<string:account>')
api.add_resource(CreateUser, '/api/create/user')
api.add_resource(DeleteUser, '/api/delete/user')
api.add_resource(UpdateUser, '/api/update/user')
api.add_resource(UserLogin, '/api/login')
api.add_resource(UserLogout, '/api/logout')
@app.route('/swagger')
def index():
return """<head>
<meta http-equiv="refresh" content="0; url=http://petstore.swagger.io/?url=http://localhost:5000/api/swagger.json" />
</head>"""
app.run(debug=True, host='0.0.0.0',port=8000)
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "b5d1471f",
"metadata": {},
"outputs": [],
"source": [
"import flask"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6ce11d76",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 5
}
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os, sys
sys.path.append(os.path.join('../'))
from app import db
class Users(db.Model):
_id = db.Column('id', db.Integer, primary_key=True,autoincrement="auto")
name = db.Column('name', db.String(20))
account = db.Column('account', db.String(20))
password = db.Column('password', db.String(20))
def __init__(self, name, account, password):
self.name =name
self.account = account
self.password = password
db.create_all()
\ No newline at end of file
from flask_restful.reqparse import RequestParser
from flask_restful_swagger_2 import swagger, Resource
from flask import session
import os, sys
sys.path.append(os.path.join('./', 'models'))
from UserModel import Users,db
class GetAllUsers(Resource):
@swagger.doc({
'tags': ['user'],
'description': 'Returns all user',
'parameters': [
],
'responses': {
'200': {
'description': 'User',
'examples': {
'application/json': {
"count":1,
"users":{
'id': 1,
'name': 'somebody',
'account':'account'
}
}
}
}
}
})
def get(self):
users = db.session.query(Users).all()
response = {"count":len(users),"users":[]}
for user in users:
data = {"id":user._id,"account":user.account,"name":user.name}
response["users"].append(data)
return response,200
class GetUser(Resource):
@swagger.doc({
'tags': ['user'],
'description': 'Returns all user',
'parameters': [
],
'responses': {
'200': {
'description': 'User',
'examples': {
'application/json': {
"count":1,
"users":{
'id': 1,
'name': 'somebody',
'account':'account'
}
}
}
}
}
})
def get(self,account):
users = db.session.query(Users).filter_by(account=account).all()
response = {"count":len(users),"users":[]}
for user in users:
data = {"id":user._id,"account":user.account,"name":user.name}
response["users"].append(data)
return response,200
class CreateUser(Resource):
post_parser = RequestParser()
post_parser.add_argument('name', type=str, required=True)
post_parser.add_argument('account', type=str, required=True)
post_parser.add_argument('password', type=str, required=True)
post_parser.add_argument('repassword', type=str, required=True)
@swagger.doc({
'tags': ['user'],
'description': 'Create user',
'reqparser': {'name': 'UserModel',
'parser': post_parser},
'responses': {
'201': {
'description': 'User',
'examples': {
'application/json': {
'msg':"新增成功"
}
},
}
}
})
def post(self):
args = self.post_parser.parse_args()
# 檢查是否有重複帳號
if(db.session.query(Users).filter_by(account=args['account']).count()>0):
return {"msg":"已有重複帳號"},500
# 檢查密碼兩次輸入是否相同
if(args["password"] != args["repassword"]):
return {"msg":"兩次輸入的密碼不同"},500
# 新增至資料庫
new_user = Users(name=args["name"],account=args["account"],password=args["password"])
db.session.add(new_user)
db.session.commit()
db.session.refresh(new_user)
return {"msg":"新增成功",'id':new_user._id},201
class DeleteUser(Resource):
post_parser = RequestParser()
post_parser.add_argument('id', type=int, required=True)
@swagger.doc({
'tags': ['user'],
'description': 'Delete user',
'reqparser': {'name': 'UserModel',
'parser': post_parser},
'responses': {
'200': {
'description': 'User',
'examples': {
'application/json': {
'msg':"山除成功"
}
},
}
}
})
def post(self):
args = self.post_parser.parse_args()
# 檢查帳號是否存
user = db.session.query(Users).filter_by(_id=args['id'])
if(user.count() == 0):
return {"msg":"帳號不存在"},500
# 刪除帳號
user.delete()
db.session.commit()
return {"msg":"刪除成功",'id':args['id']},200
class UpdateUser(Resource):
post_parser = RequestParser()
post_parser.add_argument('name', type=str, required=True)
post_parser.add_argument('account', type=str, required=True)
post_parser.add_argument('password', type=str, required=True)
post_parser.add_argument('repassword', type=str, required=True)
@swagger.doc({
'tags': ['user'],
'description': 'update user',
'reqparser': {'name': 'UserModel',
'parser': post_parser},
'responses': {
'201': {
'description': 'User',
'examples': {
'application/json': {
'msg':"修改成功"
}
},
}
}
})
def post(self):
args = self.post_parser.parse_args()
# 檢查是否有重複帳號
users = db.session.query(Users).filter_by(account=args['account'])
if(users.count() == 0):
return {"msg":"帳號不存在"},500
# 檢查密碼兩次輸入是否相同
if(args["password"] != args["repassword"]):
return {"msg":"兩次輸入的密碼不同"},500
# 更新至資料庫
users[0].name =args["name"]
users[0].password = args["password"]
db.session.commit()
return {"msg":"更新成功"},200
class UserLogin(Resource):
post_parser = RequestParser()
post_parser.add_argument('account', type=str, required=True)
post_parser.add_argument('password', type=str, required=True)
@swagger.doc({
'tags': ['user'],
'description': 'user login',
'reqparser': {'name': 'UserModel',
'parser': post_parser},
'responses': {
'200': {
'description': 'User',
'examples': {
'application/json': {
"msg":"登入成功"
}
}
}
}
})
def post(self):
args = self.post_parser.parse_args()
users = db.session.query(Users).filter_by(account=args['account']).all()
if(len(users) == 0):
return {"msg":"帳號不存在"},500
if(users[0].password != args['password']):
return {"msg":"密碼錯誤"},500
session["account"] = args['account']
return {"msg":"登入成功"},200
class UserLogout(Resource):
def post(self):
session["account"] = None
return {"msg":"登出成功"},200
\ No newline at end of file
[supervisord]
nodaemon=true
[program:nginx]
command=nginx
[program:python]
command=uwsgi --ini /etc/uwsgi.ini
\ No newline at end of file
[uwsgi]
module = run_v1:app
http-socket = 0.0.0.0:5000
processes = 3
chdir = /app
socket = /var/uwsgi.sock
logto = /log/uwsgi_access.log
chmod-socket = 006
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment