2017-08-29 1 views
0

Je construis une application flask qui se déploie sur AWS Lambda en utilisant zappa et j'essaie d'utiliser Flask-s3 pour gérer les fichiers statiques. Je ne l'ai jamais utilisé [Flask-S3] [1] avant et il semblait assez simple mais je reçois ...AttributeError: l'objet 'FlaskS3' n'a pas d'attribut 'url_for'

AttributeError: 'FlaskS3' object has no attribute 'url_for'

Ils je comprends comme il vous suffit de remplacer votre URL statique est avec url_for comme ceci:

app.config['FLASKS3_BUCKET_NAME'] = 'mybucketname' 
s3 = FlaskS3(app) 

s3.url_for('static/file.jpg') 

Ce ne fonctionne pas si bien que je fais quelque chose de mal, mais il n'y a presque rien dépannage en ligne Flask-s3. Tout est utile.

app = Flask(__name__) 
Bootstrap(app) 
app.config['FLASKS3_BUCKET_NAME'] = 'mybucketname' 
s3 = FlaskS3(app) 
MAILGUN_API_KEY = 'key' 
auth = ('api', MAILGUN_API_KEY) 


@app.route("/", methods=['GET', 'POST']) 
def index(): 
    context = { 
    'image': url_for('static/property_home.jpeg'), 
    'heading': 'We sell property - At a discount!', 
    'landing_video': url_for('static/intro.mp4') 
    } 
    form = forms.OptIn() 
    if form.validate_on_submit(): 
     validate = requests.get(
      "https://api.mailgun.net/v3/address/private/validate", 
      auth=auth, 
      params={"address": form.email.data}) 
     if validate.json()['did_you_mean'] is not None: 
      flash('Did you mean {}?'.format(validate.json()['did_you_mean'])) 
     elif validate.json()['is_valid'] == True and validate.json()['is_role_address'] == False and validate.json()['is_disposable_address'] == False: 
      r = requests.post(
      "https://api.mailgun.net/v3/lists/YOUR_DOMAIN_NAME/members", 
      auth=auth, 
      data={'subscribed': True, 
        'address': form.email.data}) 
      if r.status_code == 200: 
       requests.post('https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages', 
        auth=auth, 
        data={"from": '[email protected]', 
         "to": form.email.data, 
         "subject": "Welcome to Spokane Discount Properties", 
         "html": open('templates/indoc.html'), 
         "o:tag": 'indoctrinated'}) 
       flash('Thanks, we will notify you when we have more properties') 
      else: 
       flash('You are already subscribed, we will notify you when more properties are available') 
     else: 
      flash('Holy guacamole! Best check yo self, this is not a valid email.') 
    return render_template('index.html', form=form, context=context) 

Répondre

0

De l'doc here

In terms of getting your application to use external Amazon S3 URLs when referring to your application’s static assets, passing your Flask object to the FlaskS3 object is all that needs to be done.

L'extension se charge de gérer la url_for pour vous. Vous n'avez donc pas besoin de l'appeler directement.

Internally, every time url_for is called in one of your application’s templates, flask_s3.url_for is instead invoked. If the endpoint provided is deemed to refer to static assets, then the S3 URL for the asset specified in the filename argument is instead returned. Otherwise, flask_s3.url_for passes the call on to flask.url_for.

changement ceci:

context = { 
    'image': url_for('static/property_home.jpeg'), 
    'heading': 'We sell property - At a discount!', 
    'landing_video': url_for('static/intro.mp4') 
    } 

à:

context = { 
    'image': url_for('static', filename= 'property_home.jpeg'), 
    'heading': 'We sell property - At a discount!', 
    'landing_video': url_for('static', filename='intro.mp4') 
    } 
+0

Merci @Mekicha mais j'avais déjà essayé simplement en utilisant 'url_for' par lui-même. Je reçois alors 'BuildError: Impossible de créer l'URL pour le point de terminaison' – freefly0313

+0

J'ai besoin de voir votre code pour pouvoir vous aider. 'url_for' s'attend à une fonction principalement. – Mekicha

+0

Merci encore. J'ai ajouté mon code pour vous – freefly0313