First revision
This commit is contained in:
parent
4f79a72294
commit
97c73b639d
3
.gitignore
vendored
3
.gitignore
vendored
@ -201,3 +201,6 @@ dist-ssr
|
|||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
# </FRONT_END_IGNORE>
|
# </FRONT_END_IGNORE>
|
||||||
|
|
||||||
|
# Ignore bundled virtual environment
|
||||||
|
backend_flask/flask/
|
||||||
|
|||||||
57
README.md
57
README.md
@ -1 +1,56 @@
|
|||||||
# SurfSmart
|
# SurfSmart
|
||||||
|
|
||||||
|
SurfSmart is a web application with a Flask backend and a React/Vite frontend.
|
||||||
|
|
||||||
|
## Deployment Overview
|
||||||
|
|
||||||
|
1. **System packages**
|
||||||
|
```bash
|
||||||
|
sudo dnf install -y git python3.12 python3.12-virtualenv nodejs npm redis
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Clone the repository**
|
||||||
|
```bash
|
||||||
|
git clone <repo-url> /opt/surfsmart
|
||||||
|
cd /opt/surfsmart
|
||||||
|
```
|
||||||
|
|
||||||
|
Remove any bundled virtual environment if present:
|
||||||
|
```bash
|
||||||
|
rm -rf backend_flask/flask
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Create a Python virtual environment and install dependencies**
|
||||||
|
```bash
|
||||||
|
python3.12 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install -r backend_flask/requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Environment variables**
|
||||||
|
Create a `.env` file and define at least the following:
|
||||||
|
```bash
|
||||||
|
MONGO_URI="mongodb+srv://<user>:<pass>@cluster.mongodb.net/?retryWrites=true&w=majority"
|
||||||
|
SECRET_KEY="replace_with_random_secret"
|
||||||
|
FRONTEND_ORIGIN="https://surfsmart.tech"
|
||||||
|
FLASK_CONFIG="production"
|
||||||
|
CELERY_BROKER_URL="redis://localhost:6379/0"
|
||||||
|
CELERY_RESULT_BACKEND="redis://localhost:6379/0"
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Systemd services**
|
||||||
|
See `surfsmart-backend.service` and `surfsmart-celery.service` examples in the repository root for running Gunicorn and Celery as services.
|
||||||
|
|
||||||
|
6. **Build the React frontend**
|
||||||
|
```bash
|
||||||
|
cd frontend_react
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
The build artifacts will be located in `frontend_react/dist`.
|
||||||
|
|
||||||
|
7. **Nginx configuration**
|
||||||
|
Configure Nginx to serve the static frontend and proxy `/api/` requests to Gunicorn running the Flask application.
|
||||||
|
|
||||||
|
This is only a brief outline. Adjust file paths and domain names to your environment.
|
||||||
|
|||||||
0
backend/__init__.py
Normal file
0
backend/__init__.py
Normal file
4
backend/app.py
Normal file
4
backend/app.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from backend_flask.myapp import create_app
|
||||||
|
|
||||||
|
__all__ = ["create_app"]
|
||||||
|
|
||||||
2
backend/extensions.py
Normal file
2
backend/extensions.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from backend_flask.myapp.extensions import *
|
||||||
|
|
||||||
@ -1,247 +0,0 @@
|
|||||||
<#
|
|
||||||
.Synopsis
|
|
||||||
Activate a Python virtual environment for the current PowerShell session.
|
|
||||||
|
|
||||||
.Description
|
|
||||||
Pushes the python executable for a virtual environment to the front of the
|
|
||||||
$Env:PATH environment variable and sets the prompt to signify that you are
|
|
||||||
in a Python virtual environment. Makes use of the command line switches as
|
|
||||||
well as the `pyvenv.cfg` file values present in the virtual environment.
|
|
||||||
|
|
||||||
.Parameter VenvDir
|
|
||||||
Path to the directory that contains the virtual environment to activate. The
|
|
||||||
default value for this is the parent of the directory that the Activate.ps1
|
|
||||||
script is located within.
|
|
||||||
|
|
||||||
.Parameter Prompt
|
|
||||||
The prompt prefix to display when this virtual environment is activated. By
|
|
||||||
default, this prompt is the name of the virtual environment folder (VenvDir)
|
|
||||||
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
|
||||||
|
|
||||||
.Example
|
|
||||||
Activate.ps1
|
|
||||||
Activates the Python virtual environment that contains the Activate.ps1 script.
|
|
||||||
|
|
||||||
.Example
|
|
||||||
Activate.ps1 -Verbose
|
|
||||||
Activates the Python virtual environment that contains the Activate.ps1 script,
|
|
||||||
and shows extra information about the activation as it executes.
|
|
||||||
|
|
||||||
.Example
|
|
||||||
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
|
||||||
Activates the Python virtual environment located in the specified location.
|
|
||||||
|
|
||||||
.Example
|
|
||||||
Activate.ps1 -Prompt "MyPython"
|
|
||||||
Activates the Python virtual environment that contains the Activate.ps1 script,
|
|
||||||
and prefixes the current prompt with the specified string (surrounded in
|
|
||||||
parentheses) while the virtual environment is active.
|
|
||||||
|
|
||||||
.Notes
|
|
||||||
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
|
||||||
execution policy for the user. You can do this by issuing the following PowerShell
|
|
||||||
command:
|
|
||||||
|
|
||||||
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
|
||||||
|
|
||||||
For more information on Execution Policies:
|
|
||||||
https://go.microsoft.com/fwlink/?LinkID=135170
|
|
||||||
|
|
||||||
#>
|
|
||||||
Param(
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[String]
|
|
||||||
$VenvDir,
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[String]
|
|
||||||
$Prompt
|
|
||||||
)
|
|
||||||
|
|
||||||
<# Function declarations --------------------------------------------------- #>
|
|
||||||
|
|
||||||
<#
|
|
||||||
.Synopsis
|
|
||||||
Remove all shell session elements added by the Activate script, including the
|
|
||||||
addition of the virtual environment's Python executable from the beginning of
|
|
||||||
the PATH variable.
|
|
||||||
|
|
||||||
.Parameter NonDestructive
|
|
||||||
If present, do not remove this function from the global namespace for the
|
|
||||||
session.
|
|
||||||
|
|
||||||
#>
|
|
||||||
function global:deactivate ([switch]$NonDestructive) {
|
|
||||||
# Revert to original values
|
|
||||||
|
|
||||||
# The prior prompt:
|
|
||||||
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
|
||||||
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
|
||||||
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
|
||||||
}
|
|
||||||
|
|
||||||
# The prior PYTHONHOME:
|
|
||||||
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
|
||||||
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
|
||||||
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
|
||||||
}
|
|
||||||
|
|
||||||
# The prior PATH:
|
|
||||||
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
|
||||||
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
|
||||||
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
|
||||||
}
|
|
||||||
|
|
||||||
# Just remove the VIRTUAL_ENV altogether:
|
|
||||||
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
|
||||||
Remove-Item -Path env:VIRTUAL_ENV
|
|
||||||
}
|
|
||||||
|
|
||||||
# Just remove VIRTUAL_ENV_PROMPT altogether.
|
|
||||||
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
|
|
||||||
Remove-Item -Path env:VIRTUAL_ENV_PROMPT
|
|
||||||
}
|
|
||||||
|
|
||||||
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
|
||||||
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
|
||||||
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
|
||||||
}
|
|
||||||
|
|
||||||
# Leave deactivate function in the global namespace if requested:
|
|
||||||
if (-not $NonDestructive) {
|
|
||||||
Remove-Item -Path function:deactivate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
<#
|
|
||||||
.Description
|
|
||||||
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
|
||||||
given folder, and returns them in a map.
|
|
||||||
|
|
||||||
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
|
||||||
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
|
||||||
then it is considered a `key = value` line. The left hand string is the key,
|
|
||||||
the right hand is the value.
|
|
||||||
|
|
||||||
If the value starts with a `'` or a `"` then the first and last character is
|
|
||||||
stripped from the value before being captured.
|
|
||||||
|
|
||||||
.Parameter ConfigDir
|
|
||||||
Path to the directory that contains the `pyvenv.cfg` file.
|
|
||||||
#>
|
|
||||||
function Get-PyVenvConfig(
|
|
||||||
[String]
|
|
||||||
$ConfigDir
|
|
||||||
) {
|
|
||||||
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
|
||||||
|
|
||||||
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
|
||||||
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
|
||||||
|
|
||||||
# An empty map will be returned if no config file is found.
|
|
||||||
$pyvenvConfig = @{ }
|
|
||||||
|
|
||||||
if ($pyvenvConfigPath) {
|
|
||||||
|
|
||||||
Write-Verbose "File exists, parse `key = value` lines"
|
|
||||||
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
|
||||||
|
|
||||||
$pyvenvConfigContent | ForEach-Object {
|
|
||||||
$keyval = $PSItem -split "\s*=\s*", 2
|
|
||||||
if ($keyval[0] -and $keyval[1]) {
|
|
||||||
$val = $keyval[1]
|
|
||||||
|
|
||||||
# Remove extraneous quotations around a string value.
|
|
||||||
if ("'""".Contains($val.Substring(0, 1))) {
|
|
||||||
$val = $val.Substring(1, $val.Length - 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
$pyvenvConfig[$keyval[0]] = $val
|
|
||||||
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $pyvenvConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
<# Begin Activate script --------------------------------------------------- #>
|
|
||||||
|
|
||||||
# Determine the containing directory of this script
|
|
||||||
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
|
||||||
$VenvExecDir = Get-Item -Path $VenvExecPath
|
|
||||||
|
|
||||||
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
|
||||||
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
|
||||||
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
|
||||||
|
|
||||||
# Set values required in priority: CmdLine, ConfigFile, Default
|
|
||||||
# First, get the location of the virtual environment, it might not be
|
|
||||||
# VenvExecDir if specified on the command line.
|
|
||||||
if ($VenvDir) {
|
|
||||||
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
|
||||||
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
|
||||||
Write-Verbose "VenvDir=$VenvDir"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Next, read the `pyvenv.cfg` file to determine any required value such
|
|
||||||
# as `prompt`.
|
|
||||||
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
|
||||||
|
|
||||||
# Next, set the prompt from the command line, or the config file, or
|
|
||||||
# just use the name of the virtual environment folder.
|
|
||||||
if ($Prompt) {
|
|
||||||
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
|
||||||
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
|
||||||
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
|
||||||
$Prompt = $pyvenvCfg['prompt'];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
|
|
||||||
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
|
||||||
$Prompt = Split-Path -Path $venvDir -Leaf
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose "Prompt = '$Prompt'"
|
|
||||||
Write-Verbose "VenvDir='$VenvDir'"
|
|
||||||
|
|
||||||
# Deactivate any currently active virtual environment, but leave the
|
|
||||||
# deactivate function in place.
|
|
||||||
deactivate -nondestructive
|
|
||||||
|
|
||||||
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
|
||||||
# that there is an activated venv.
|
|
||||||
$env:VIRTUAL_ENV = $VenvDir
|
|
||||||
|
|
||||||
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
|
||||||
|
|
||||||
Write-Verbose "Setting prompt to '$Prompt'"
|
|
||||||
|
|
||||||
# Set the prompt to include the env name
|
|
||||||
# Make sure _OLD_VIRTUAL_PROMPT is global
|
|
||||||
function global:_OLD_VIRTUAL_PROMPT { "" }
|
|
||||||
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
|
||||||
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
|
||||||
|
|
||||||
function global:prompt {
|
|
||||||
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
|
||||||
_OLD_VIRTUAL_PROMPT
|
|
||||||
}
|
|
||||||
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
|
||||||
}
|
|
||||||
|
|
||||||
# Clear PYTHONHOME
|
|
||||||
if (Test-Path -Path Env:PYTHONHOME) {
|
|
||||||
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
|
||||||
Remove-Item -Path Env:PYTHONHOME
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add the venv to the PATH
|
|
||||||
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
|
||||||
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
|
||||||
@ -1,70 +0,0 @@
|
|||||||
# This file must be used with "source bin/activate" *from bash*
|
|
||||||
# You cannot run it directly
|
|
||||||
|
|
||||||
deactivate () {
|
|
||||||
# reset old environment variables
|
|
||||||
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
|
|
||||||
PATH="${_OLD_VIRTUAL_PATH:-}"
|
|
||||||
export PATH
|
|
||||||
unset _OLD_VIRTUAL_PATH
|
|
||||||
fi
|
|
||||||
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
|
|
||||||
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
|
|
||||||
export PYTHONHOME
|
|
||||||
unset _OLD_VIRTUAL_PYTHONHOME
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Call hash to forget past commands. Without forgetting
|
|
||||||
# past commands the $PATH changes we made may not be respected
|
|
||||||
hash -r 2> /dev/null
|
|
||||||
|
|
||||||
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
|
||||||
PS1="${_OLD_VIRTUAL_PS1:-}"
|
|
||||||
export PS1
|
|
||||||
unset _OLD_VIRTUAL_PS1
|
|
||||||
fi
|
|
||||||
|
|
||||||
unset VIRTUAL_ENV
|
|
||||||
unset VIRTUAL_ENV_PROMPT
|
|
||||||
if [ ! "${1:-}" = "nondestructive" ] ; then
|
|
||||||
# Self destruct!
|
|
||||||
unset -f deactivate
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# unset irrelevant variables
|
|
||||||
deactivate nondestructive
|
|
||||||
|
|
||||||
# on Windows, a path can contain colons and backslashes and has to be converted:
|
|
||||||
if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then
|
|
||||||
# transform D:\path\to\venv to /d/path/to/venv on MSYS
|
|
||||||
# and to /cygdrive/d/path/to/venv on Cygwin
|
|
||||||
export VIRTUAL_ENV=$(cygpath /home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask)
|
|
||||||
else
|
|
||||||
# use the path as-is
|
|
||||||
export VIRTUAL_ENV=/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask
|
|
||||||
fi
|
|
||||||
|
|
||||||
_OLD_VIRTUAL_PATH="$PATH"
|
|
||||||
PATH="$VIRTUAL_ENV/"bin":$PATH"
|
|
||||||
export PATH
|
|
||||||
|
|
||||||
# unset PYTHONHOME if set
|
|
||||||
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
|
||||||
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
|
||||||
if [ -n "${PYTHONHOME:-}" ] ; then
|
|
||||||
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
|
||||||
unset PYTHONHOME
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
|
||||||
_OLD_VIRTUAL_PS1="${PS1:-}"
|
|
||||||
PS1='(flask) '"${PS1:-}"
|
|
||||||
export PS1
|
|
||||||
VIRTUAL_ENV_PROMPT='(flask) '
|
|
||||||
export VIRTUAL_ENV_PROMPT
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Call hash to forget past commands. Without forgetting
|
|
||||||
# past commands the $PATH changes we made may not be respected
|
|
||||||
hash -r 2> /dev/null
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
# This file must be used with "source bin/activate.csh" *from csh*.
|
|
||||||
# You cannot run it directly.
|
|
||||||
|
|
||||||
# Created by Davide Di Blasi <davidedb@gmail.com>.
|
|
||||||
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
|
|
||||||
|
|
||||||
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
|
|
||||||
|
|
||||||
# Unset irrelevant variables.
|
|
||||||
deactivate nondestructive
|
|
||||||
|
|
||||||
setenv VIRTUAL_ENV /home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask
|
|
||||||
|
|
||||||
set _OLD_VIRTUAL_PATH="$PATH"
|
|
||||||
setenv PATH "$VIRTUAL_ENV/"bin":$PATH"
|
|
||||||
|
|
||||||
|
|
||||||
set _OLD_VIRTUAL_PROMPT="$prompt"
|
|
||||||
|
|
||||||
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
|
|
||||||
set prompt = '(flask) '"$prompt"
|
|
||||||
setenv VIRTUAL_ENV_PROMPT '(flask) '
|
|
||||||
endif
|
|
||||||
|
|
||||||
alias pydoc python -m pydoc
|
|
||||||
|
|
||||||
rehash
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
# This file must be used with "source <venv>/bin/activate.fish" *from fish*
|
|
||||||
# (https://fishshell.com/). You cannot run it directly.
|
|
||||||
|
|
||||||
function deactivate -d "Exit virtual environment and return to normal shell environment"
|
|
||||||
# reset old environment variables
|
|
||||||
if test -n "$_OLD_VIRTUAL_PATH"
|
|
||||||
set -gx PATH $_OLD_VIRTUAL_PATH
|
|
||||||
set -e _OLD_VIRTUAL_PATH
|
|
||||||
end
|
|
||||||
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
|
|
||||||
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
|
|
||||||
set -e _OLD_VIRTUAL_PYTHONHOME
|
|
||||||
end
|
|
||||||
|
|
||||||
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
|
|
||||||
set -e _OLD_FISH_PROMPT_OVERRIDE
|
|
||||||
# prevents error when using nested fish instances (Issue #93858)
|
|
||||||
if functions -q _old_fish_prompt
|
|
||||||
functions -e fish_prompt
|
|
||||||
functions -c _old_fish_prompt fish_prompt
|
|
||||||
functions -e _old_fish_prompt
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
set -e VIRTUAL_ENV
|
|
||||||
set -e VIRTUAL_ENV_PROMPT
|
|
||||||
if test "$argv[1]" != "nondestructive"
|
|
||||||
# Self-destruct!
|
|
||||||
functions -e deactivate
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Unset irrelevant variables.
|
|
||||||
deactivate nondestructive
|
|
||||||
|
|
||||||
set -gx VIRTUAL_ENV /home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask
|
|
||||||
|
|
||||||
set -gx _OLD_VIRTUAL_PATH $PATH
|
|
||||||
set -gx PATH "$VIRTUAL_ENV/"bin $PATH
|
|
||||||
|
|
||||||
# Unset PYTHONHOME if set.
|
|
||||||
if set -q PYTHONHOME
|
|
||||||
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
|
||||||
set -e PYTHONHOME
|
|
||||||
end
|
|
||||||
|
|
||||||
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
|
||||||
# fish uses a function instead of an env var to generate the prompt.
|
|
||||||
|
|
||||||
# Save the current fish_prompt function as the function _old_fish_prompt.
|
|
||||||
functions -c fish_prompt _old_fish_prompt
|
|
||||||
|
|
||||||
# With the original prompt function renamed, we can override with our own.
|
|
||||||
function fish_prompt
|
|
||||||
# Save the return status of the last command.
|
|
||||||
set -l old_status $status
|
|
||||||
|
|
||||||
# Output the venv prompt; color taken from the blue of the Python logo.
|
|
||||||
printf "%s%s%s" (set_color 4B8BBE) '(flask) ' (set_color normal)
|
|
||||||
|
|
||||||
# Restore the return status of the previous command.
|
|
||||||
echo "exit $old_status" | .
|
|
||||||
# Output the original/"old" prompt.
|
|
||||||
_old_fish_prompt
|
|
||||||
end
|
|
||||||
|
|
||||||
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
|
||||||
set -gx VIRTUAL_ENV_PROMPT '(flask) '
|
|
||||||
end
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from celery.__main__ import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from dotenv.__main__ import cli
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(cli())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from numpy.f2py.f2py2e import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from flask.cli import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from httpx import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
import jsonpatch
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Diff two JSON files')
|
|
||||||
parser.add_argument('FILE1', type=argparse.FileType('r'))
|
|
||||||
parser.add_argument('FILE2', type=argparse.FileType('r'))
|
|
||||||
parser.add_argument('--indent', type=int, default=None,
|
|
||||||
help='Indent output by n spaces')
|
|
||||||
parser.add_argument('-u', '--preserve-unicode', action='store_true',
|
|
||||||
help='Output Unicode character as-is without using Code Point')
|
|
||||||
parser.add_argument('-v', '--version', action='version',
|
|
||||||
version='%(prog)s ' + jsonpatch.__version__)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
try:
|
|
||||||
diff_files()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def diff_files():
|
|
||||||
""" Diffs two JSON files and prints a patch """
|
|
||||||
args = parser.parse_args()
|
|
||||||
doc1 = json.load(args.FILE1)
|
|
||||||
doc2 = json.load(args.FILE2)
|
|
||||||
patch = jsonpatch.make_patch(doc1, doc2)
|
|
||||||
if patch.patch:
|
|
||||||
print(json.dumps(patch.patch, indent=args.indent, ensure_ascii=not(args.preserve_unicode)))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@ -1,107 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os.path
|
|
||||||
import json
|
|
||||||
import jsonpatch
|
|
||||||
import tempfile
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description='Apply a JSON patch on a JSON file')
|
|
||||||
parser.add_argument('ORIGINAL', type=argparse.FileType('r'),
|
|
||||||
help='Original file')
|
|
||||||
parser.add_argument('PATCH', type=argparse.FileType('r'),
|
|
||||||
nargs='?', default=sys.stdin,
|
|
||||||
help='Patch file (read from stdin if omitted)')
|
|
||||||
parser.add_argument('--indent', type=int, default=None,
|
|
||||||
help='Indent output by n spaces')
|
|
||||||
parser.add_argument('-b', '--backup', action='store_true',
|
|
||||||
help='Back up ORIGINAL if modifying in-place')
|
|
||||||
parser.add_argument('-i', '--in-place', action='store_true',
|
|
||||||
help='Modify ORIGINAL in-place instead of to stdout')
|
|
||||||
parser.add_argument('-v', '--version', action='version',
|
|
||||||
version='%(prog)s ' + jsonpatch.__version__)
|
|
||||||
parser.add_argument('-u', '--preserve-unicode', action='store_true',
|
|
||||||
help='Output Unicode character as-is without using Code Point')
|
|
||||||
|
|
||||||
def main():
|
|
||||||
try:
|
|
||||||
patch_files()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def patch_files():
|
|
||||||
""" Diffs two JSON files and prints a patch """
|
|
||||||
args = parser.parse_args()
|
|
||||||
doc = json.load(args.ORIGINAL)
|
|
||||||
patch = json.load(args.PATCH)
|
|
||||||
result = jsonpatch.apply_patch(doc, patch)
|
|
||||||
|
|
||||||
if args.in_place:
|
|
||||||
dirname = os.path.abspath(os.path.dirname(args.ORIGINAL.name))
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Attempt to replace the file atomically. We do this by
|
|
||||||
# creating a temporary file in the same directory as the
|
|
||||||
# original file so we can atomically move the new file over
|
|
||||||
# the original later. (This is done in the same directory
|
|
||||||
# because atomic renames do not work across mount points.)
|
|
||||||
|
|
||||||
fd, pathname = tempfile.mkstemp(dir=dirname)
|
|
||||||
fp = os.fdopen(fd, 'w')
|
|
||||||
atomic = True
|
|
||||||
|
|
||||||
except OSError:
|
|
||||||
# We failed to create the temporary file for an atomic
|
|
||||||
# replace, so fall back to non-atomic mode by backing up
|
|
||||||
# the original (if desired) and writing a new file.
|
|
||||||
|
|
||||||
if args.backup:
|
|
||||||
os.rename(args.ORIGINAL.name, args.ORIGINAL.name + '.orig')
|
|
||||||
fp = open(args.ORIGINAL.name, 'w')
|
|
||||||
atomic = False
|
|
||||||
|
|
||||||
else:
|
|
||||||
# Since we're not replacing the original file in-place, write
|
|
||||||
# the modified JSON to stdout instead.
|
|
||||||
|
|
||||||
fp = sys.stdout
|
|
||||||
|
|
||||||
# By this point we have some sort of file object we can write the
|
|
||||||
# modified JSON to.
|
|
||||||
|
|
||||||
json.dump(result, fp, indent=args.indent, ensure_ascii=not(args.preserve_unicode))
|
|
||||||
fp.write('\n')
|
|
||||||
|
|
||||||
if args.in_place:
|
|
||||||
# Close the new file. If we aren't replacing atomically, this
|
|
||||||
# is our last step, since everything else is already in place.
|
|
||||||
|
|
||||||
fp.close()
|
|
||||||
|
|
||||||
if atomic:
|
|
||||||
try:
|
|
||||||
# Complete the atomic replace by linking the original
|
|
||||||
# to a backup (if desired), fixing up the permissions
|
|
||||||
# on the temporary file, and moving it into place.
|
|
||||||
|
|
||||||
if args.backup:
|
|
||||||
os.link(args.ORIGINAL.name, args.ORIGINAL.name + '.orig')
|
|
||||||
os.chmod(pathname, os.stat(args.ORIGINAL.name).st_mode)
|
|
||||||
os.rename(pathname, args.ORIGINAL.name)
|
|
||||||
|
|
||||||
except OSError:
|
|
||||||
# In the event we could not actually do the atomic
|
|
||||||
# replace, unlink the original to move it out of the
|
|
||||||
# way and finally move the temporary file into place.
|
|
||||||
|
|
||||||
os.unlink(args.ORIGINAL.name)
|
|
||||||
os.rename(pathname, args.ORIGINAL.name)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@ -1,67 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import jsonpointer
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description='Resolve a JSON pointer on JSON files')
|
|
||||||
|
|
||||||
# Accept pointer as argument or as file
|
|
||||||
ptr_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
|
|
||||||
ptr_group.add_argument('-f', '--pointer-file', type=argparse.FileType('r'),
|
|
||||||
nargs='?',
|
|
||||||
help='File containing a JSON pointer expression')
|
|
||||||
|
|
||||||
ptr_group.add_argument('POINTER', type=str, nargs='?',
|
|
||||||
help='A JSON pointer expression')
|
|
||||||
|
|
||||||
parser.add_argument('FILE', type=argparse.FileType('r'), nargs='+',
|
|
||||||
help='Files for which the pointer should be resolved')
|
|
||||||
parser.add_argument('--indent', type=int, default=None,
|
|
||||||
help='Indent output by n spaces')
|
|
||||||
parser.add_argument('-v', '--version', action='version',
|
|
||||||
version='%(prog)s ' + jsonpointer.__version__)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
try:
|
|
||||||
resolve_files()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_pointer(args):
|
|
||||||
if args.POINTER:
|
|
||||||
ptr = args.POINTER
|
|
||||||
elif args.pointer_file:
|
|
||||||
ptr = args.pointer_file.read().strip()
|
|
||||||
else:
|
|
||||||
parser.print_usage()
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
return ptr
|
|
||||||
|
|
||||||
|
|
||||||
def resolve_files():
|
|
||||||
""" Resolve a JSON pointer on JSON files """
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
ptr = parse_pointer(args)
|
|
||||||
|
|
||||||
for f in args.FILE:
|
|
||||||
doc = json.load(f)
|
|
||||||
try:
|
|
||||||
result = jsonpointer.resolve_pointer(doc, ptr)
|
|
||||||
print(json.dumps(result, indent=args.indent))
|
|
||||||
except jsonpointer.JsonPointerException as e:
|
|
||||||
print('Could not resolve pointer: %s' % str(e), file=sys.stderr)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from langchain.server import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from charset_normalizer import cli
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(cli.cli_detect())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from pip._internal.cli.main import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from pip._internal.cli.main import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from pip._internal.cli.main import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from pytest import console_main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(console_main())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from rsa.cli import decrypt
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(decrypt())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from rsa.cli import encrypt
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(encrypt())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from rsa.cli import keygen
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(keygen())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from rsa.util import private_to_public
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(private_to_public())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from rsa.cli import sign
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(sign())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from rsa.cli import verify
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(verify())
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from pytest import console_main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(console_main())
|
|
||||||
@ -1 +0,0 @@
|
|||||||
python3
|
|
||||||
@ -1 +0,0 @@
|
|||||||
/usr/bin/python3
|
|
||||||
@ -1 +0,0 @@
|
|||||||
python3
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from tqdm.cli import main
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,164 +0,0 @@
|
|||||||
/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
|
|
||||||
|
|
||||||
/* Greenlet object interface */
|
|
||||||
|
|
||||||
#ifndef Py_GREENLETOBJECT_H
|
|
||||||
#define Py_GREENLETOBJECT_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <Python.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This is deprecated and undocumented. It does not change. */
|
|
||||||
#define GREENLET_VERSION "1.0.0"
|
|
||||||
|
|
||||||
#ifndef GREENLET_MODULE
|
|
||||||
#define implementation_ptr_t void*
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _greenlet {
|
|
||||||
PyObject_HEAD
|
|
||||||
PyObject* weakreflist;
|
|
||||||
PyObject* dict;
|
|
||||||
implementation_ptr_t pimpl;
|
|
||||||
} PyGreenlet;
|
|
||||||
|
|
||||||
#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type))
|
|
||||||
|
|
||||||
|
|
||||||
/* C API functions */
|
|
||||||
|
|
||||||
/* Total number of symbols that are exported */
|
|
||||||
#define PyGreenlet_API_pointers 12
|
|
||||||
|
|
||||||
#define PyGreenlet_Type_NUM 0
|
|
||||||
#define PyExc_GreenletError_NUM 1
|
|
||||||
#define PyExc_GreenletExit_NUM 2
|
|
||||||
|
|
||||||
#define PyGreenlet_New_NUM 3
|
|
||||||
#define PyGreenlet_GetCurrent_NUM 4
|
|
||||||
#define PyGreenlet_Throw_NUM 5
|
|
||||||
#define PyGreenlet_Switch_NUM 6
|
|
||||||
#define PyGreenlet_SetParent_NUM 7
|
|
||||||
|
|
||||||
#define PyGreenlet_MAIN_NUM 8
|
|
||||||
#define PyGreenlet_STARTED_NUM 9
|
|
||||||
#define PyGreenlet_ACTIVE_NUM 10
|
|
||||||
#define PyGreenlet_GET_PARENT_NUM 11
|
|
||||||
|
|
||||||
#ifndef GREENLET_MODULE
|
|
||||||
/* This section is used by modules that uses the greenlet C API */
|
|
||||||
static void** _PyGreenlet_API = NULL;
|
|
||||||
|
|
||||||
# define PyGreenlet_Type \
|
|
||||||
(*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM])
|
|
||||||
|
|
||||||
# define PyExc_GreenletError \
|
|
||||||
((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM])
|
|
||||||
|
|
||||||
# define PyExc_GreenletExit \
|
|
||||||
((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PyGreenlet_New(PyObject *args)
|
|
||||||
*
|
|
||||||
* greenlet.greenlet(run, parent=None)
|
|
||||||
*/
|
|
||||||
# define PyGreenlet_New \
|
|
||||||
(*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_New_NUM])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PyGreenlet_GetCurrent(void)
|
|
||||||
*
|
|
||||||
* greenlet.getcurrent()
|
|
||||||
*/
|
|
||||||
# define PyGreenlet_GetCurrent \
|
|
||||||
(*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PyGreenlet_Throw(
|
|
||||||
* PyGreenlet *greenlet,
|
|
||||||
* PyObject *typ,
|
|
||||||
* PyObject *val,
|
|
||||||
* PyObject *tb)
|
|
||||||
*
|
|
||||||
* g.throw(...)
|
|
||||||
*/
|
|
||||||
# define PyGreenlet_Throw \
|
|
||||||
(*(PyObject * (*)(PyGreenlet * self, \
|
|
||||||
PyObject * typ, \
|
|
||||||
PyObject * val, \
|
|
||||||
PyObject * tb)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_Throw_NUM])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
|
|
||||||
*
|
|
||||||
* g.switch(*args, **kwargs)
|
|
||||||
*/
|
|
||||||
# define PyGreenlet_Switch \
|
|
||||||
(*(PyObject * \
|
|
||||||
(*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_Switch_NUM])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
|
|
||||||
*
|
|
||||||
* g.parent = new_parent
|
|
||||||
*/
|
|
||||||
# define PyGreenlet_SetParent \
|
|
||||||
(*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_SetParent_NUM])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PyGreenlet_GetParent(PyObject* greenlet)
|
|
||||||
*
|
|
||||||
* return greenlet.parent;
|
|
||||||
*
|
|
||||||
* This could return NULL even if there is no exception active.
|
|
||||||
* If it does not return NULL, you are responsible for decrementing the
|
|
||||||
* reference count.
|
|
||||||
*/
|
|
||||||
# define PyGreenlet_GetParent \
|
|
||||||
(*(PyGreenlet* (*)(PyGreenlet*)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_GET_PARENT_NUM])
|
|
||||||
|
|
||||||
/*
|
|
||||||
* deprecated, undocumented alias.
|
|
||||||
*/
|
|
||||||
# define PyGreenlet_GET_PARENT PyGreenlet_GetParent
|
|
||||||
|
|
||||||
# define PyGreenlet_MAIN \
|
|
||||||
(*(int (*)(PyGreenlet*)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_MAIN_NUM])
|
|
||||||
|
|
||||||
# define PyGreenlet_STARTED \
|
|
||||||
(*(int (*)(PyGreenlet*)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_STARTED_NUM])
|
|
||||||
|
|
||||||
# define PyGreenlet_ACTIVE \
|
|
||||||
(*(int (*)(PyGreenlet*)) \
|
|
||||||
_PyGreenlet_API[PyGreenlet_ACTIVE_NUM])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Macro that imports greenlet and initializes C API */
|
|
||||||
/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we
|
|
||||||
keep the older definition to be sure older code that might have a copy of
|
|
||||||
the header still works. */
|
|
||||||
# define PyGreenlet_Import() \
|
|
||||||
{ \
|
|
||||||
_PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* GREENLET_MODULE */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* !Py_GREENLETOBJECT_H */
|
|
||||||
@ -1 +0,0 @@
|
|||||||
lib
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
home = /usr/bin
|
|
||||||
include-system-site-packages = false
|
|
||||||
version = 3.12.3
|
|
||||||
executable = /usr/bin/python3.12
|
|
||||||
command = /usr/bin/python3 -m venv /home/gellar/Desktop/program/project/SurfSmart/backend_flask/flask
|
|
||||||
@ -84,7 +84,7 @@ def create_app(config_name='default') -> Flask:
|
|||||||
from .urls import bp as urls_bp
|
from .urls import bp as urls_bp
|
||||||
|
|
||||||
# Register with potentially more specific prefixes
|
# Register with potentially more specific prefixes
|
||||||
app.register_blueprint(auth_bp, url_prefix='/api/auth')
|
app.register_blueprint(auth_bp, url_prefix='/api')
|
||||||
app.register_blueprint(ai_services_bp, url_prefix="/api/ai") # Changed prefix
|
app.register_blueprint(ai_services_bp, url_prefix="/api/ai") # Changed prefix
|
||||||
app.register_blueprint(activity_bp, url_prefix='/api/activity')
|
app.register_blueprint(activity_bp, url_prefix='/api/activity')
|
||||||
app.register_blueprint(projects_bp, url_prefix='/api/projects')
|
app.register_blueprint(projects_bp, url_prefix='/api/projects')
|
||||||
|
|||||||
@ -4,8 +4,8 @@ from flask import Blueprint
|
|||||||
|
|
||||||
# Define the Blueprint instance for the authentication module.
|
# Define the Blueprint instance for the authentication module.
|
||||||
# 'auth' is the unique name for this blueprint.
|
# 'auth' is the unique name for this blueprint.
|
||||||
# url_prefix='/api/auth' will be prepended to all routes defined in this blueprint.
|
# url_prefix='/api' so routes like '/register' become '/api/register'
|
||||||
bp = Blueprint('auth', __name__, url_prefix='/api/auth')
|
bp = Blueprint('auth', __name__, url_prefix='/api')
|
||||||
|
|
||||||
# Import the routes module.
|
# Import the routes module.
|
||||||
# This connects the routes defined in routes.py to the 'bp' instance.
|
# This connects the routes defined in routes.py to the 'bp' instance.
|
||||||
|
|||||||
@ -5,11 +5,7 @@ import secrets
|
|||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
# MongoDB Atlas connection string: set it in your environment variables
|
# MongoDB Atlas connection string: set it in your environment variables
|
||||||
MONGO_URI: str = os.environ.get(
|
MONGO_URI: str = os.environ.get("MONGO_URI", "mongodb://localhost:27017/surfsmart")
|
||||||
"MONGO_URI",
|
|
||||||
"mongodb+srv://surfsmart_server:IVV0mzUcwoEqHjNV@projectdatacluster.ki0t3z8.mongodb.net/surfsmart?retryWrites=true&w=majority&appName=ProjectDataCluster"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Flask secret key for sessions and JWT (use a secure value in production)
|
# Flask secret key for sessions and JWT (use a secure value in production)
|
||||||
SECRET_KEY: str = os.environ.get("SECRET_KEY", secrets.token_hex(32))
|
SECRET_KEY: str = os.environ.get("SECRET_KEY", secrets.token_hex(32))
|
||||||
|
|
||||||
|
|||||||
@ -92,7 +92,7 @@ tenacity==9.1.2
|
|||||||
tqdm==4.67.1
|
tqdm==4.67.1
|
||||||
typing-inspect==0.9.0
|
typing-inspect==0.9.0
|
||||||
typing-inspection==0.4.0
|
typing-inspection==0.4.0
|
||||||
typing_extensions==4.13.2
|
typing_extensions==4.12.2
|
||||||
tzdata==2025.2
|
tzdata==2025.2
|
||||||
uritemplate==4.1.1
|
uritemplate==4.1.1
|
||||||
urllib3==2.4.0
|
urllib3==2.4.0
|
||||||
|
|||||||
8
env.example
Normal file
8
env.example
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Environment variables for SurfSmart deployment
|
||||||
|
MONGO_URI=mongodb://localhost:27017/surfsmart
|
||||||
|
OPENAI_API_KEY=your-openai-api-key
|
||||||
|
SECRET_KEY=replace_with_random_secret
|
||||||
|
FRONTEND_ORIGIN=https://surfsmart.tech
|
||||||
|
FLASK_CONFIG=production
|
||||||
|
CELERY_BROKER_URL=redis://localhost:6379/0
|
||||||
|
CELERY_RESULT_BACKEND=redis://localhost:6379/0
|
||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// Base URL for your Flask API - IMPORTANT: Adjust if your backend runs elsewhere
|
// Base URL for your Flask API - IMPORTANT: Adjust if your backend runs elsewhere
|
||||||
// 后端 Flask API 的基础 URL - 重要:如果后端运行在别处,请调整
|
// 后端 Flask API 的基础 URL - 重要:如果后端运行在别处,请调整
|
||||||
const API_BASE_URL = 'http://localhost:5000'; // Assuming Flask runs on port 5000
|
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:5000'; // Assuming Flask runs on port 5000
|
||||||
|
|
||||||
// --- Helper function to get Auth Token ---
|
// --- Helper function to get Auth Token ---
|
||||||
// --- 获取认证 Token 的辅助函数 ---
|
// --- 获取认证 Token 的辅助函数 ---
|
||||||
|
|||||||
12
surfsmart-backend.service
Normal file
12
surfsmart-backend.service
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SurfSmart Flask Backend
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/surfsmart/backend_flask
|
||||||
|
EnvironmentFile=/opt/surfsmart/.env
|
||||||
|
ExecStart=/opt/surfsmart/venv/bin/gunicorn -w 4 -b 127.0.0.1:5000 run:app
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
12
surfsmart-celery.service
Normal file
12
surfsmart-celery.service
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SurfSmart Celery Worker
|
||||||
|
After=network.target redis.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/surfsmart/backend_flask
|
||||||
|
EnvironmentFile=/opt/surfsmart/.env
|
||||||
|
ExecStart=/opt/surfsmart/venv/bin/celery -A backend_flask.celery_worker.celery_app worker --loglevel=info
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
Loading…
x
Reference in New Issue
Block a user