User:Youjung/SI30: Unbordering/Prototyping: Difference between revisions

From XPUB & Lens-Based wiki
Line 50: Line 50:


==== observations.py ====
==== observations.py ====
  import json
<syntaxhighlight lang="python">
  import os
import json
  from flask import Flask, render_template, request
import os
  from prefix import PrefixMiddleware #added for server upload
from flask import Flask, render_template, request
 
from prefix import PrefixMiddleware #added for server upload
  app = Flask(__name__)
 
 
app = Flask(__name__)
  app.wsgi_app = PrefixMiddleware(app.wsgi_app, '/sergio/SI30/fieldwork-tools/places_i_would_not_visit') #added for server upload
 
 
app.wsgi_app = PrefixMiddleware(app.wsgi_app, '/sergio/SI30/fieldwork-tools/places_i_would_not_visit')
 
 
  os.makedirs("static/uploads", exist_ok=True)
os.makedirs("static/uploads", exist_ok=True)
 
 
  @app.route("/", methods=["GET", "POST"])
@app.route("/", methods=["GET", "POST"])
  def main():
def main():
      with open("database.json", "r") as f:
    with open("database.json", "r") as f:
          observations = json.load(f)
        observations = json.load(f)
 
 
      if request.method == "POST":
    if request.method == "POST":
          observation = dict(request.form)
        observation = dict(request.form)
 
 
          img = request.files["images"]
        img = request.files["images"]
          if img and img.filename != "":
        if img and img.filename != "":
              img.save("static/uploads/" + img.filename)
            img.save("static/uploads/" + img.filename)
              observation["image"] = img.filename
            observation["image"] = img.filename
          else:
        else:
              observation["image"] = None
            observation["image"] = None
 
 
          observations.append(observation)
        observations.append(observation)
 
 
          with open("database.json", "w+") as f:
        with open("database.json", "w+") as f:
              f.write(json.dumps(observations, indent=2))
            f.write(json.dumps(observations, indent=2))
 
 
      return render_template("observations.html", observations=observations)
    return render_template("observations.html", observations=observations)
 
 
  if __name__ == "__main__":
if __name__ == "__main__":
      app.run(host="0.0.0.0", port=5110) #added for server upload
    app.run(host="0.0.0.0", port=5110) #added for server upload
      # app.run(debug=True)
    # app.run(debug=True)
</syntaxhighlight>


==== database.json ====
==== database.json ====

Revision as of 09:21, 18 April 2026

Documentation on prototyping with flask.

Flask Set up

Flask documentation page from prototyping class.

1. Install
$ uv venv
$ source .venv/bin/activate
$ uv pip install flask
2. Restarting your project
$ source .venv/bin/activate
$ flask --app <filename> run

PLACES I WOULD NORMALLY NOT VISIT IN ROTTERDAM

Idea

Where are the places that you would normally not visit? And why would you not visit these places? Maybe it's because you do not have the needs, you do not like the vibe, you do not like the neighborhood or you have some kind of phobia.

Rotterdam is a culturally diverse city, and there are invisible borders that divide they neighborhood. What determines these borders can be boundaries created by cultural/religious differences. This boundary can be derived from fear, overwhelm, unfamiliarity or even disgust. You might need courage to cross these borders. These borders and boundaries are very situated on personal background. Through this flask prototype, I'd like to document places that I fear to visit, maybe with some friends and try to identify what are our borders. Maybe even find patterns and compare.

The protocol is that you have to physically visit the location, take a picture, maybe even go inside and engage with the people there and share an anecdote on this page.

Requirements

This page needs a form that includes...

  • location name
  • address
  • visited check box
  • anecdote
  • image upload
  • select contributor

These collected data will be stored in a .json file and images would be collected in a separate folder.

File structure

CSS and uploaded images are stored in the static folder because they need to be directly accessible by the browser. Flask automatically serves anything in this folder publicly.

.
├── database.json
├── observations.py
├── static
│   ├── reset.css
│   ├── style.css
│   └── uploads
│       └── collectedimg.png
└── templates
    └── observations.html

Code

observations.py

import json
import os
from flask import Flask, render_template, request
from prefix import PrefixMiddleware #added for server upload

app = Flask(__name__)

app.wsgi_app = PrefixMiddleware(app.wsgi_app, '/sergio/SI30/fieldwork-tools/places_i_would_not_visit')

os.makedirs("static/uploads", exist_ok=True)

@app.route("/", methods=["GET", "POST"])
def main():
    with open("database.json", "r") as f:
        observations = json.load(f)

    if request.method == "POST":
        observation = dict(request.form)

        img = request.files["images"]
        if img and img.filename != "":
            img.save("static/uploads/" + img.filename)
            observation["image"] = img.filename
        else:
            observation["image"] = None

        observations.append(observation)

        with open("database.json", "w+") as f:
            f.write(json.dumps(observations, indent=2))

    return render_template("observations.html", observations=observations)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5110) #added for server upload
    # app.run(debug=True)

database.json

be aware of comma, [{}] structure

observations.html

{%%}

customization according to contributor

Uploading to Sergio(server)

Followed this documentation but encountered some problems. This is how I solved it.

1. Replace .venv and install flask

# remove existing venv
rm -rf .venv

# make new venv on server
python3 -m venv .venv

# install flask
.venv/bin/pip install flask

2. Import PrefixMiddleware in observation.py

from prefix import PrefixMiddleware

3. Host setting --host=0.0.0.0

4. Reload nginx

5. 413 Request Entity too large

Documentation in progress...