fix compatibility to IE and deployment with nginx and uWSGI
This commit is contained in:
@@ -28,7 +28,8 @@ INSTALLED_APPS = [
|
||||
'corsheaders',
|
||||
'rest_framework.authtoken',
|
||||
'captcha',
|
||||
'favicon'
|
||||
'favicon',
|
||||
'raven.contrib.django.raven_compat',
|
||||
]
|
||||
|
||||
# 作用于全局的中间件,一个Request进来会从上到下调用各个中间件的process_request()方法,再传给具体的View,得到的Response从下到上调用各个中间件的process_response()方法
|
||||
@@ -104,24 +105,6 @@ STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
|
||||
MEDIA_URL = "/media/"
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
|
||||
|
||||
'''
|
||||
非Django原生setting项,仅用于REST-Framework
|
||||
'''
|
||||
REST_FRAMEWORK = {
|
||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||
'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # JSON Web Token Authentication
|
||||
),
|
||||
# 设置限速策略,防止爬虫拖垮网站(仅作用于设置了throttle_classes的ViewSet)
|
||||
'DEFAULT_THROTTLE_CLASSES': (
|
||||
'rest_framework.throttling.AnonRateThrottle',
|
||||
'rest_framework.throttling.UserRateThrottle'
|
||||
),
|
||||
'DEFAULT_THROTTLE_RATES': {
|
||||
'anon': '1000/minute', # 对于未登录用户,每分钟最多访问4次
|
||||
'user': '1200/minute' # 对于已登录用户,每分钟最多访问6次
|
||||
}
|
||||
}
|
||||
|
||||
'''
|
||||
非Django原生setting项,仅用于REST-Framework-JWT
|
||||
'''
|
||||
@@ -136,4 +119,27 @@ JWT_AUTH = {
|
||||
'''
|
||||
REST_FRAMEWORK_EXTENSIONS = {
|
||||
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 15 * 60, # 设置缓存有效时间
|
||||
}
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': False,
|
||||
'handlers': {
|
||||
'console': { # Log to stdout
|
||||
'level': 'INFO',
|
||||
'class': 'logging.StreamHandler',
|
||||
},
|
||||
'file': {
|
||||
'level': 'DEBUG',
|
||||
'class': 'logging.FileHandler',
|
||||
'filename': os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'logs', 'django-logging.txt'),
|
||||
},
|
||||
},
|
||||
'loggers': {
|
||||
'django.request': {
|
||||
'handlers': ['file'],
|
||||
'level': 'INFO',
|
||||
'propagate': True,
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -14,4 +14,6 @@ if CONFIG_ENV == 'local':
|
||||
elif CONFIG_ENV == 'remote':
|
||||
from setting_split.remote import *
|
||||
elif CONFIG_ENV == 'initial':
|
||||
from setting_split.initial import *
|
||||
from setting_split.initial import *
|
||||
|
||||
import os
|
||||
@@ -2,7 +2,7 @@
|
||||
__author__ = 'HymanLu'
|
||||
|
||||
from django.conf.urls import url, include
|
||||
from APP_Inventor_case_base.settings import MEDIA_ROOT
|
||||
from APP_Inventor_case_base.settings import MEDIA_ROOT, DEBUG
|
||||
from django.views.static import serve
|
||||
from rest_framework.documentation import include_docs_urls
|
||||
from rest_framework.routers import DefaultRouter
|
||||
@@ -12,7 +12,6 @@ from cases.views import CasesListViewSet, CategoryViewset, HotSearchsViewset, Ba
|
||||
from questions.views import QuestionsListViewSet
|
||||
from users.views import UserViewset, PictureCodeView
|
||||
from user_operation.views import UserFavViewset
|
||||
from django.views.generic import TemplateView
|
||||
from utils.file_views import UploadFileView, DeleteFileView
|
||||
|
||||
router = DefaultRouter() # 利用了ViewSet的重载as_view()方法进行请求方法和处理函数的动态绑定(简单好用,只需要逐一register,然后urls函数即可)
|
||||
@@ -32,9 +31,13 @@ urlpatterns = [
|
||||
url(r'^hotcategory/', HotCategoryView.as_view()), # 获取案例数量最多的若干个案例类型
|
||||
url(r'^picturecodes/', PictureCodeView.as_view(), name='picturecodes'), # 获取验证码图片
|
||||
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), # 默认的通过账号和密码进行验证的方式(login和logout方法)
|
||||
url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}), # path 将作为第二参数传到server进行处理
|
||||
url(r'docs/', include_docs_urls(title="APP Inventor案例库")), # 自动生成的API说明文档
|
||||
url(r'^api-token-auth/', views.obtain_auth_token), # drf自带的token认证模式(一般称为Session模式)
|
||||
url(r'^login/', obtain_jwt_token), # jwt的认证接口(较之drf自带的认证模式,占用的服务器端资源更少,安全性更高)
|
||||
url(r'^captcha/', include('captcha.urls')), # django-simple-captcha模块用于获取图片的URL
|
||||
]
|
||||
]
|
||||
|
||||
if DEBUG:
|
||||
urlpatterns = urlpatterns.extend([
|
||||
url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}), # path 将作为第二参数传到server进行处理
|
||||
])
|
||||
@@ -5,6 +5,6 @@ import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "drf_vue_website.settings")
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "APP_Inventor_case_base.settings")
|
||||
|
||||
application = get_wsgi_application()
|
||||
|
||||
@@ -4,7 +4,7 @@ __author__ = 'HymanLu'
|
||||
import os
|
||||
import sys
|
||||
|
||||
# 常用参数:makemigrations、migrate、runserver 0.0.0.0:8000、startapp
|
||||
# 常用参数:makemigrations、migrate、runserver 0.0.0.0:8000、startapp、raven test
|
||||
if __name__ == "__main__":
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "APP_Inventor_case_base.settings")
|
||||
try:
|
||||
|
||||
+2
-10
@@ -1,13 +1,5 @@
|
||||
{
|
||||
"presets": [
|
||||
"es2015"
|
||||
],
|
||||
"plugins": ["transform-runtime"],
|
||||
"comments": false,
|
||||
"env": {
|
||||
"test": {
|
||||
"presets": ["env", "stage-2"],
|
||||
"plugins": ["istanbul"]
|
||||
}
|
||||
}
|
||||
"es2015-ie"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ require('shelljs/global')
|
||||
env.NODE_ENV = 'production'
|
||||
|
||||
var path = require('path')
|
||||
var config = require('../config')
|
||||
var config = require('./config')
|
||||
var ora = require('ora')
|
||||
var webpack = require('webpack')
|
||||
var webpackConfig = require('./webpack.prod.conf')
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||
var path = require('path')
|
||||
|
||||
module.exports = {
|
||||
build: {
|
||||
env: {NODE_ENV: '"production"'},
|
||||
index: path.resolve(__dirname, '../dist/index.html'), // index.html文件的路径
|
||||
assetsRoot: path.resolve(__dirname, '../dist'), // build时公共资源根目录
|
||||
assetsSubDirectory: 'static', // 公共资源子目录
|
||||
assetsPublicPath: '/', // dev时公共资源根目录
|
||||
productionSourceMap: true,
|
||||
productionGzip: false, // 是否对productionGzipExtensions中包含的后缀的文件进行压缩处理
|
||||
productionGzipExtensions: ['js', 'css'] // 对该后缀的文件进行压缩处理
|
||||
},
|
||||
dev: {
|
||||
env: {NODE_ENV: '"development"'},
|
||||
port: 8020,
|
||||
proxyTable: {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
require('./check-versions')();
|
||||
var config = require('../config');
|
||||
var config = require('./config');
|
||||
if (!process.env.NODE_ENV) process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV);
|
||||
var path = require('path');
|
||||
var express = require('express');
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
var path = require('path')
|
||||
var config = require('../config')
|
||||
var config = require('./config')
|
||||
var ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
|
||||
exports.assetsPath = function(_path) {
|
||||
@@ -51,7 +51,7 @@ exports.cssLoaders = function(options) {
|
||||
sass: generateLoaders('sass', { indentedSyntax: true }),
|
||||
scss: generateLoaders('sass'),
|
||||
stylus: generateLoaders('stylus'),
|
||||
styl: generateLoaders('stylus')
|
||||
styl: generateLoaders('stylus'),
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
var utils = require('./utils')
|
||||
var config = require('../config')
|
||||
var config = require('./config')
|
||||
var isProduction = process.env.NODE_ENV === 'production'
|
||||
|
||||
module.exports = {
|
||||
@@ -8,4 +8,4 @@ module.exports = {
|
||||
config.build.productionSourceMap : config.dev.cssSourceMap,
|
||||
extract: true
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
var path = require('path')
|
||||
var config = require('../config')
|
||||
var config = require('./config')
|
||||
var utils = require('./utils')
|
||||
var ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
var vueLoaderConfig = require('./vue-loader.conf')
|
||||
@@ -75,20 +75,20 @@ module.exports = {
|
||||
loader: 'vue-loader',
|
||||
options: vueLoaderConfig
|
||||
},
|
||||
/*
|
||||
awesome-typescript-loader等同于
|
||||
thread-loader/happypack是进行多线程/进程编译,可充分利用多核cpu。
|
||||
hard-source-webpack-plugin/cache-loader是记录编译缓存,编译增量编译。
|
||||
ts-loader进行 TypeScript编译。
|
||||
fork-ts-checker单独线程/进程进行错误检查。
|
||||
*/
|
||||
{
|
||||
test: /\.ts$/,
|
||||
loader:'ts-loader',
|
||||
exclude: /node_modules/,
|
||||
options: {
|
||||
appendTsSuffixTo: [/\.vue$/],
|
||||
}
|
||||
use: [
|
||||
{
|
||||
loader: 'babel-loader'
|
||||
},
|
||||
{
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
appendTsSuffixTo: [/\.vue$/],
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
var utils = require('./utils')
|
||||
var webpack = require('webpack')
|
||||
var config = require('../config')
|
||||
var config = require('./config')
|
||||
var merge = require('webpack-merge')
|
||||
var baseWebpackConfig = require('./webpack.base.conf')
|
||||
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
var path = require('path')
|
||||
var config = require('../config')
|
||||
var config = require('./config')
|
||||
var utils = require('./utils')
|
||||
var webpack = require('webpack')
|
||||
var merge = require('webpack-merge')
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
var merge = require('webpack-merge')
|
||||
var prodEnv = require('./prod.env')
|
||||
|
||||
module.exports = merge(prodEnv, {
|
||||
NODE_ENV: '"development"'
|
||||
})
|
||||
@@ -1,21 +0,0 @@
|
||||
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||
var path = require('path')
|
||||
|
||||
module.exports = {
|
||||
build: {
|
||||
env: require('./prod.env'),
|
||||
index: path.resolve(__dirname, '../dist/index.html'), // index.html文件的路径
|
||||
assetsRoot: path.resolve(__dirname, '../dist'), // build时公共资源根目录
|
||||
assetsSubDirectory: 'static', // 公共资源子目录
|
||||
assetsPublicPath: '/', // dev时公共资源根目录
|
||||
productionSourceMap: true,
|
||||
productionGzip: false, // 是否对productionGzipExtensions中包含的后缀的文件进行压缩处理
|
||||
productionGzipExtensions: ['js', 'css'] // 对该后缀的文件进行压缩处理
|
||||
},
|
||||
dev: {
|
||||
env: require('./dev.env'),
|
||||
port: 8020,
|
||||
proxyTable: {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
NODE_ENV: '"production"'
|
||||
}
|
||||
@@ -29,6 +29,7 @@
|
||||
<div id="app" v-cloak>
|
||||
<router-view></router-view>
|
||||
</div>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
|
||||
<!-- Bootstrap依赖于jQuery -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
||||
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
|
||||
|
||||
Generated
+358
-44
@@ -359,7 +359,7 @@
|
||||
"enhanced-resolve": "3.3.0",
|
||||
"loader-utils": "1.1.0",
|
||||
"lodash": "4.17.4",
|
||||
"micromatch": "3.1.4",
|
||||
"micromatch": "3.1.5",
|
||||
"mkdirp": "0.5.1",
|
||||
"object-assign": "4.1.1",
|
||||
"source-map-support": "0.4.18"
|
||||
@@ -435,9 +435,9 @@
|
||||
}
|
||||
},
|
||||
"extglob": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.3.tgz",
|
||||
"integrity": "sha512-AyptZexgu7qppEPq59DtN/XJGZDrLcVxSHai+4hdgMMS9EpF4GBvygcWWApno8lL9qSjVpYt7Raao28qzJX1ww==",
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
|
||||
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"array-unique": "0.3.2",
|
||||
@@ -462,6 +462,46 @@
|
||||
"to-regex-range": "2.1.1"
|
||||
}
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
||||
@@ -525,9 +565,9 @@
|
||||
}
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "3.1.4",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.4.tgz",
|
||||
"integrity": "sha512-kFRtviKYoAJT+t7HggMl0tBFGNAKLw/S7N+CO9qfEQyisob1Oy4pao+geRbkyeEd+V9aOkvZ4mhuyPvI/q9Sfg==",
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz",
|
||||
"integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arr-diff": "4.0.0",
|
||||
@@ -535,10 +575,10 @@
|
||||
"braces": "2.3.0",
|
||||
"define-property": "1.0.0",
|
||||
"extend-shallow": "2.0.1",
|
||||
"extglob": "2.0.3",
|
||||
"extglob": "2.0.4",
|
||||
"fragment-cache": "0.2.1",
|
||||
"kind-of": "6.0.2",
|
||||
"nanomatch": "1.2.6",
|
||||
"nanomatch": "1.2.7",
|
||||
"object.pick": "1.3.0",
|
||||
"regex-not": "1.0.0",
|
||||
"snapdragon": "0.8.1",
|
||||
@@ -1164,6 +1204,15 @@
|
||||
"babel-runtime": "6.26.0"
|
||||
}
|
||||
},
|
||||
"babel-plugin-transform-object-assign": {
|
||||
"version": "6.22.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz",
|
||||
"integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"babel-runtime": "6.26.0"
|
||||
}
|
||||
},
|
||||
"babel-plugin-transform-object-rest-spread": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
|
||||
@@ -1174,6 +1223,16 @@
|
||||
"babel-runtime": "6.26.0"
|
||||
}
|
||||
},
|
||||
"babel-plugin-transform-proto-to-assign": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-proto-to-assign/-/babel-plugin-transform-proto-to-assign-6.26.0.tgz",
|
||||
"integrity": "sha1-xJPiSmJ0mkT37ellBsDLOhiR9ns=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"babel-runtime": "6.26.0",
|
||||
"lodash": "4.17.4"
|
||||
}
|
||||
},
|
||||
"babel-plugin-transform-regenerator": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
|
||||
@@ -1284,6 +1343,37 @@
|
||||
"babel-plugin-transform-regenerator": "6.26.0"
|
||||
}
|
||||
},
|
||||
"babel-preset-es2015-ie": {
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-preset-es2015-ie/-/babel-preset-es2015-ie-6.7.0.tgz",
|
||||
"integrity": "sha1-T8Of8zENBzI6BLzZfJxyl5tAe2I=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"babel-plugin-check-es2015-constants": "6.22.0",
|
||||
"babel-plugin-transform-es2015-arrow-functions": "6.22.0",
|
||||
"babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
|
||||
"babel-plugin-transform-es2015-block-scoping": "6.26.0",
|
||||
"babel-plugin-transform-es2015-classes": "6.24.1",
|
||||
"babel-plugin-transform-es2015-computed-properties": "6.24.1",
|
||||
"babel-plugin-transform-es2015-destructuring": "6.23.0",
|
||||
"babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
|
||||
"babel-plugin-transform-es2015-for-of": "6.23.0",
|
||||
"babel-plugin-transform-es2015-function-name": "6.24.1",
|
||||
"babel-plugin-transform-es2015-literals": "6.22.0",
|
||||
"babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
|
||||
"babel-plugin-transform-es2015-object-super": "6.24.1",
|
||||
"babel-plugin-transform-es2015-parameters": "6.24.1",
|
||||
"babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
|
||||
"babel-plugin-transform-es2015-spread": "6.22.0",
|
||||
"babel-plugin-transform-es2015-sticky-regex": "6.24.1",
|
||||
"babel-plugin-transform-es2015-template-literals": "6.22.0",
|
||||
"babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
|
||||
"babel-plugin-transform-es2015-unicode-regex": "6.24.1",
|
||||
"babel-plugin-transform-object-assign": "6.22.0",
|
||||
"babel-plugin-transform-proto-to-assign": "6.26.0",
|
||||
"babel-plugin-transform-regenerator": "6.26.0"
|
||||
}
|
||||
},
|
||||
"babel-preset-stage-2": {
|
||||
"version": "6.24.1",
|
||||
"resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
|
||||
@@ -1395,7 +1485,7 @@
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"cache-base": "1.0.1",
|
||||
"class-utils": "0.3.5",
|
||||
"class-utils": "0.3.6",
|
||||
"component-emitter": "1.2.1",
|
||||
"define-property": "1.0.0",
|
||||
"isobject": "3.0.1",
|
||||
@@ -1856,15 +1946,14 @@
|
||||
}
|
||||
},
|
||||
"class-utils": {
|
||||
"version": "0.3.5",
|
||||
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz",
|
||||
"integrity": "sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA=",
|
||||
"version": "0.3.6",
|
||||
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
|
||||
"integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arr-union": "3.1.0",
|
||||
"define-property": "0.2.5",
|
||||
"isobject": "3.0.1",
|
||||
"lazy-cache": "2.0.2",
|
||||
"static-extend": "0.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -1877,6 +1966,46 @@
|
||||
"is-descriptor": "0.1.6"
|
||||
}
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
||||
@@ -1899,15 +2028,6 @@
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
|
||||
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
|
||||
"dev": true
|
||||
},
|
||||
"lazy-cache": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
|
||||
"integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"set-getter": "0.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2558,7 +2678,7 @@
|
||||
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-descriptor": "1.0.1"
|
||||
"is-descriptor": "1.0.2"
|
||||
}
|
||||
},
|
||||
"defined": {
|
||||
@@ -4250,12 +4370,20 @@
|
||||
"dev": true
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
|
||||
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
"kind-of": "6.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-arrayish": {
|
||||
@@ -4294,12 +4422,20 @@
|
||||
"dev": true
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
|
||||
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
"kind-of": "6.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-date-object": {
|
||||
@@ -4309,20 +4445,20 @@
|
||||
"dev": true
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.1.tgz",
|
||||
"integrity": "sha512-G3fFVFTqfaqu7r4YuSBHKBAuOaLz8Sy7ekklUpFEliaLMP1Y2ZjoN9jS62YWCAPQrQpMUQSitRlrzibbuCZjdA==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
|
||||
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-accessor-descriptor": "0.1.6",
|
||||
"is-data-descriptor": "0.1.4",
|
||||
"kind-of": "5.1.0"
|
||||
"is-accessor-descriptor": "1.0.0",
|
||||
"is-data-descriptor": "1.0.0",
|
||||
"kind-of": "6.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
|
||||
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
@@ -5231,9 +5367,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"nanomatch": {
|
||||
"version": "1.2.6",
|
||||
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.6.tgz",
|
||||
"integrity": "sha512-WJ6XTCbvWXUFPbi/bDwKcYkCeOGUHzaJj72KbuPqGn78Ba/F5Vu26Zlo6SuMQbCIst1RGKL1zfWBCOGAlbRLAg==",
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz",
|
||||
"integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arr-diff": "4.0.0",
|
||||
@@ -5499,6 +5635,24 @@
|
||||
"is-descriptor": "0.1.6"
|
||||
}
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
||||
@@ -7517,6 +7671,46 @@
|
||||
"is-descriptor": "0.1.6"
|
||||
}
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
||||
@@ -7737,6 +7931,46 @@
|
||||
"is-descriptor": "0.1.6"
|
||||
}
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
||||
@@ -8074,6 +8308,46 @@
|
||||
"is-descriptor": "0.1.6"
|
||||
}
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
||||
@@ -8577,6 +8851,46 @@
|
||||
"is-descriptor": "0.1.6"
|
||||
}
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
||||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "3.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "1.1.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
"babel-plugin-transform-runtime": "^6.22.0",
|
||||
"babel-preset-env": "^1.2.1",
|
||||
"babel-preset-es2015": "^6.24.1",
|
||||
"babel-preset-es2015-ie": "^6.7.0",
|
||||
"babel-preset-stage-2": "^6.22.0",
|
||||
"babel-register": "^6.22.0",
|
||||
"chalk": "^1.1.3",
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
// 语法编译为es5语法,与Vue的浏览器支持保持一致
|
||||
// 语法编译为es5
|
||||
"target": "es5",
|
||||
"jsx": "preserve",
|
||||
// 模块采用import语法且不作转换(利用webpack 2+的tree-shake)
|
||||
"module": "es2015",
|
||||
// 这可以对'this'上的数据属性进行更严格的推断
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# the upstream component nginx needs to connect to
|
||||
upstream django {
|
||||
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
|
||||
}
|
||||
|
||||
server {
|
||||
listen 8000;
|
||||
charset utf-8;
|
||||
|
||||
# max upload size
|
||||
client_max_body_size 75M; # adjust to taste
|
||||
|
||||
# Django media
|
||||
location /media {
|
||||
alias /srv/APP_Inventor_case_base_website/src/back-end-src/media; # your Django project's media files - amend as required
|
||||
}
|
||||
|
||||
location /static {
|
||||
alias /srv/APP_Inventor_case_base_website/src/back-end-src/static; # your Django project's static files - amend as required
|
||||
}
|
||||
|
||||
# Finally, send all non-media requests to the Django server.
|
||||
location / {
|
||||
uwsgi_pass django;
|
||||
include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -11,6 +11,7 @@ server {
|
||||
location / {
|
||||
root /srv/APP_Inventor_case_base_website/src/front-end-src/dist;
|
||||
index index.html;
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,13 @@
|
||||
[program:programmingcases]
|
||||
|
||||
command = python3 manage.py runserver 0.0.0.0:8000
|
||||
# nohup uwsgi --socket 127.0.0.1:8001 --module APP_Inventor_case_base.wsgi </dev/null &>/dev/null &
|
||||
|
||||
command = uwsgi --socket 127.0.0.1:8001 --module APP_Inventor_case_base.wsgi
|
||||
directory = /srv/APP_Inventor_case_base_website/src/back-end-src
|
||||
user = root
|
||||
startsecs = 3
|
||||
|
||||
redirect_stderr = true
|
||||
stdout_logfile_maxbytes = 50MB
|
||||
stdout_logfile_backups = 10
|
||||
stdout_logfile_backups = 2
|
||||
stdout_logfile = /srv/log/supervisor/app.log
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
raven
|
||||
django==2.0.1
|
||||
pillow
|
||||
mysqlclient
|
||||
@@ -26,4 +27,5 @@ beautifulsoup4
|
||||
pymysql
|
||||
fabric3
|
||||
simplejson
|
||||
paramiko
|
||||
paramiko
|
||||
uWSGI
|
||||
Reference in New Issue
Block a user