描述: 获取请求工作正常。 python解释器的例子:
r = requests.get(" http://openshift-XXXXXXXXX/get_all_posts")
r.text
' {"帖子":[]}'
但问题是要发布帖子请求: 我举个例子:
r = requests.post(" http://openshift-XXXXXXXX/create_user",json = {"用户名":"用户","昵称&# 34;:"尼克","密码":"传递"})
r.text
' \ n500内部服务器错误\ n
内部服务器错误
\ n服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出错。
\ n'
任何帮助都将不胜感激。
setup.py
from setuptools import setup
setup(name='YourAppName',
version='1.0',
description='OpenShift App',
author='Ludvig Westerdahl',
author_email='example@example.com',
url='http://www.python.org/sigs/distutils-sig/',
install_requires=['Flask','Flask-SQLAlchemy>=2.1', "sqlalchemy>=1.0.11"],
)
wsgi.py
#!/usr/bin/env python
import os
from magdb import app as application
virtenv = os.path.join(os.environ.get('OPENSHIFT_PYTHON_DIR','.'), 'virtenv')
if __name__ == '__main__':
from wsgiref.simple_server import make_server
httpd = make_server('localhost', 5002, application)
httpd.serve_forever()
magdb.py
from flask import Flask, json, jsonify, request, g
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import class_mapper
import os
from werkzeug.security import generate_password_hash, check_password_hash
from functools import wraps
from itsdangerous import (TimedJSONWebSignatureSerializer
as Serializer, BadSignature, SignatureExpired)
from sqlalchemy import update
# --------------------------
# --- App creation START ---
# --------------------------
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'Will Will Smith smith? Yes... Will Smith will smith'
if "OPENSHIFT_POSTGRESQL_DB_URL" in os.environ:
app.config["SQLALCHEMY_DATABASE_URI"]=os.environ['OPENSHIFT_POSTGRESQL_DB_URL']
else:
app.config["SQLALCHEMY_DATABASE_URI"]="sqlite:////tmp/testmagdb.db"
db = SQLAlchemy(app)
# --------------------------
# --- App creation END -----
# --------------------------
friends_table = db.Table("friends_table",
db.Column("user_id", db.Integer, db.ForeignKey("user.id"), primary_key=True),
db.Column("friend_id", db.Integer, db.ForeignKey("user.id"), primary_key=True),
db.PrimaryKeyConstraint("user_id", "friend_id"))
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
# --- Creation of Account requirments ---
username = db.Column(db.String(25))
nickname = db.Column(db.String(25))
password = db.Column(db.String(50))
# --- Creation of profile ---
description_column = db.Column(db.String(255))
rating = db.Column(db.Integer)
#friends = db.relationship("User", backref=db.backref("users", lazy="dynamic"), secondary=friends_table)
my_friends = db.relationship('User',
secondary=friends_table,
primaryjoin=(friends_table.c.user_id == id),
secondaryjoin=(friends_table.c.friend_id == id),
backref=db.backref("friends_of_me", lazy='dynamic'),
lazy='dynamic')
liked_posts = []
dissliked_posts = []
token = db.Column(db.Text)
def __init__(self, username, nickname, password):
self.username = username
self.nickname = nickname
self.password = generate_password_hash(password)
self.rating = 0
def reset_token(self):
self.token = None
def set_token(self, token):
self.token = token
def get_token(self):
return self.token
def check_password(self, password):
return check_password_hash(self.password, password)
def generate_auth_token(self, experation=6000):
s = Serializer(app.config['SECRET_KEY'], expires_in=experation)
return s.dumps({'id':self.id})
# --- Profile management ---
def get_rating(self):
return self.rating
def mod_rating(self, rating):
self.rating += rating
def undo_rating(self, id):
self.rating = 0
"""
if id in self.dissliked_post_list:
self.rating += 1
self.dissliked_post_list.remove(id)
if id in self.liked_post_list:
self.rating -= 1
self.liked_post_list.remove(id)
"""
def get_description(self):
return self.description
def set_description(self, description):
self.description_column = description
def get_description(self):
return self.description_column
def to_json(self):
s = {"nickname":self.nickname, "description":self.description_column, "rating":self.rating}
return json.dumps(s)
#return json.dumps(dict(username=self.username))
def to_dict(self):
s = {"nickname":self.nickname, "description":self.description_column, "rating":self.rating}
return s
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50))
game = db.Column(db.String(50))
description = db.Column(db.String(255))
comment = db.Column(db.String(255))
owner = db.relationship('User', backref=db.backref('posts', lazy='dynamic'))
owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __init__(self, title, game, description, owner):
self.title = title
self.game = game
self.description = description
self.owner = owner
self.comment = ""
def add_comment(self, comment):
self.comment = self.comment + comment
def to_json(self):
# username va nickname förut
s = {"title": self.title, "game":self.game, "description":self.description, "owner": self.owner.username, "comments":self.comment}
return json.dumps(s)
def to_dict(self):
# username va nickname förut
s = {"title": self.title, "game":self.game, "description":self.description, "owner": self.owner.username, "comments":self.comment}
return s
@app.route('/set_description', methods=['POST'])
def set_description():
input = request.get_json()
user_id = input['user_id']
description = input['description']
user = db.session.query(User).filter(User.id == user_id).first()
user.set_description(description)
commit_db()
return "Description set", 200
@app.route('/remove_friend', methods=['POST'])
def remove_friend():
input = request.get_json()
user_id = input['user_id']
friend_username = input['friend_username']
user = db.session.query(User).filter(User.id == user_id).first()
friend = db.session.query(User).filter(User.username == friend_username).first()
try:
user.my_friends.remove(friend)
commit_db()
except:
return "Not friend", 400
return "Sucess removed friend", 200
@app.route('/add_friend', methods=['POST'])
def add_friend():
input = request.get_json()
user_id = input['user_id']
friend_username = input['friend_username']
user = db.session.query(User).filter(User.id == user_id).first()
friend = db.session.query(User).filter(User.username == friend_username).first()
try:
user.my_friends.append(friend)
commit_db()
except:
return "Already friend", 400
return "Sucess added friend", 200
@app.route('/get_all_friends/<int:user_id>', methods=['GET'])
def get_all_friends(user_id):
list_of_friends = []
user = db.session.query(User).filter(User.id == user_id).first()
for friend in user.my_friends:
list_of_friends.append(friend.to_dict())
return json.dumps({"friends": list_of_friends})
@app.route('/get_friend/<username>', methods=['GET'])
def get_friend(username):
friend = db.session.query(User).filter(User.username == username).first()
return friend.to_json()
@app.route('/get_rating/<user_id>', methods=['GET'])
def get_rating(user_id):
user = db.session.query(User).filter(User.id == user_id).first()
return str(user.rating), 200
@app.route('/comment', methods=['POST'])
def comment():
input = request.get_json()
comment = input['comment']
post_id = input['post_id']
post = db.session.query(Post).filter(Post.id == post_id).first()
post.add_comment(comment + "\n")
commit_db()
return "comment:" + comment + "added", 200
@app.route('/modify_rating', methods=['POST'])
def modify_rating():
input = request.get_json()
rating = input['rating']
# This is the post that they user has clicked like on
post_id = input['post_id']
post = db.session.query(Post).filter(Post.id == post_id).first()
# The input user-id is the one that is liking/dissliking something
user_id = input['user_id']
user = db.session.query(User).filter(User.id == user_id).first()
# User liked the post
print("HERE")
if rating == 1:
print("HERE1")
if post_id in user.dissliked_posts:
user.liked_posts.append(post_id)
user.dissliked_posts.remove(post_id)
post.owner.mod_rating(2)
print("HERE2")
elif not post_id in user.liked_posts:
user.liked_posts.append(post_id)
post.owner.mod_rating(1)
print("HERE3")
elif rating == -1:
print("HERE4")
if post_id in user.liked_posts:
user.dissliked_posts.append(post_id)
user.liked_posts.remove(post_id)
post.owner.mod_rating(-2)
print("HERE5")
elif not post_id in user.dissliked_posts:
user.dissliked_posts.append(post_id)
post.owner.mod_rating(-1)
print("HERE6")
elif rating == 0:
print("HERE7")
if post_id in user.liked_posts:
user.liked_posts.remove(post_id)
post.owner.mod_rating(-1)
print("HERE8")
elif post_id in user.dissliked_posts:
user.dissliked_posts.remove(post_id)
post.owner.mod_rating(1)
print("HERE9")
print(str(post.owner.rating))
db.session.commit()
print(str(post.owner.rating))
return "DONE", 200
@app.route('/get_post/<int:post_id>', methods=['GET'])
def get_post(post_id):
try:
post = db.session.query(Post).filter(Post.id == post_id).first()
return post.to_json(), 200
except:
return "Post doesnt exist", 400
#if not post == None:
# return post.to_json(), 200
@app.route('/get_all_posts', methods=['GET'])
def get_all_posts():
list_of_posts = []
for post in db.session.query(Post).all():
list_of_posts.append(post.to_dict())
return json.dumps({"posts": list_of_posts})
@app.route('/post', methods=['POST'])
def create_post():
input = request.get_json()
title = input['title']
game = input['game']
description = input['description']
owner_id = input['owner_id']
owner = db.session.query(User).filter(User.id == owner_id).first()
post = Post(title, game, description, owner)
db.session.add(post)
commit_db()
return "Post created", 200
@app.route('/login', methods=['POST'])
def login():
input = request.get_json()
username = input['username']
password = input['password']
user_trying_to_login = db.session.query(User).filter(User.username == username).first()
if user_trying_to_login == None:
print("Inside == none")
return "Username + password not matching", 400
print("----------BEFORE CHECK PASS------")
if user_trying_to_login.check_password(password):
print("----------INSIDE CHECK PASS------")
# return id so we know which one is logged in during the session from the app
return json.dumps({"id":user_trying_to_login.id}), 200
else:
print("----------INSIDE ELSE CHECK PASS------")
return "Username(else) + password not matching", 400
@app.route('/create_user', methods=['POST'])
def create_user():
input = request.get_json()
new_user = User(input['username'], input['nickname'], input['password'])
db.session.add(new_user)
commit_db()
return "user added", 200
# ---------------------------------
# ----- Db START ------------------
# ---------------------------------
def serialize(model):
columns = [c.key for c in class_mapper(model.__class__).columns] # Create a list from the columns.
return dict((c, getattr(model, c)) for c in columns) # Return a dictionary containing the columns.
def reset_db():
try:
db.drop_all()
db.session.commit()
except: #TEST
db.session.rollback() #TEST
def commit_db():
db.session.commit()
def init_db():
db.create_all()
# ---------------------------------
# ----- Db END --------------------
# ---------------------------------
db.create_all()
@app.route('/')
def hello_world():
return "/magdb"
if __name__ == '__main__':
#app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.run(debug=True, port=5002)
基本上,sqllite数据库的本地一切正常。但随后部署到openshift,发布请求会产生内部服务器错误
答案 0 :(得分:0)
首先要做的事情:不要使用&#39;输入&#39;作为变量名称。这是&#39; input_raw&#39;的替代品。从python 3开始。
现在你的问题: 我在本地使用请求2.2.1时遇到了类似的问题。 然后我使用apt-get remove和安装的请求2.9.1使用pip 删除了python请求。
也许在openshift服务器上存在类似的问题。
答案 1 :(得分:0)
这里发生的事情是,我在openhift服务器上“哈希”的密码变得很大,因为它被认为是存储在的列。因此内部服务器错误就会出现。
总结一下:如果有人遇到类似的问题。尽管它可能在sqllite服务器上运行,但请确保它通过检查日志文件在openshift服务器上运行。一个非常好的命令,我曾经发现该列无法存储密码: rhc tail -o“-n 20”-a