'str' object has no attribute 'get'咋解决?

本人学医,凭兴趣自学python,真心不易,现在遇到一个问题:在写一个简单的注册提交页面,是想通过class将数据存储到本地的txt文件,在输入username和password,submit到register/add时,但遇到了下面的问题:

图片说明

请各位大神帮助看是什么问题。

下面是源代码,看看还有没有其他什么问题。谢谢!

app.py

 from flask import (
    Flask,
    render_template,
    request,
    redirect,
)

from Models import (Users, Requirements)
import time
import os

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
    return render_template('/index.html')


@app.route('/login')
def login():
    return render_template('/login.html')


@app.route('/register')
def register():
    return render_template('/register.html')


@app.route('/register/add', methods=['POST'])
def register_add():

    if request.method == 'POST':
        form = request.form
        print('打印', form)
        u = Users.new(form)
        u.save()

    return redirect('/login')


@app.route('/post', methods=['GET'])
def post_message():
    return render_template('/post.html')


@app.route('/post/add', methods=['POST'])
def post_add():

    if request.method == 'POST':
        form = request.form
        u = Requirements(form)
                u = Requirements.new(form)
        u.save()

    return redirect('/post')


if __name__ == '__main__':
    config = dict(
        debug=True,
        host='0.0.0.0',
        port=2000,
    )
    app.run(**config)

Model.py

 from random import Random
import json
import os


def save(data, path):

    m = json.dumps(data, ensure_ascii=False)
    # path = os.path.dirname(__file__)
    with open(path, 'a+') as f:
        f.read()
        f.write(m + '\n')
        f.close()


def load(path):
    with open(path, 'r', encoding='utf-8') as f:
        s = f.read()
        m = json.dumps(s, ensure_ascii=False)
        print('加载', type(m), m)
        t = json.loads(m)
        print('加载', type(t), t)
        return t


def random_str(randomlength=16):
    s = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars) - 1
    random = Random()
    for i in range(randomlength):
        s += chars[random.randint(0, length)]
    return s


class Model(object):

    @classmethod
    def db_path(cls):
        root = os.path.dirname(__file__)
        classname = cls.__name__
        path = '{}/data/{}.txt'.format(root, classname)
        return path


    @classmethod
    def all(cls):
        """
        all 方法(类里面的函数叫方法)使用 load 函数得到所有的 models
        """
        path = cls.db_path()
        models = load(path)
        ms = [cls.new(m) for m in models]
        return ms

    @classmethod
    def new(cls, form):
        m = cls(form)
        return m


    def save(self):
        models = self.all()
        path = self.db_path()
        l = [m.__dict__ for m in models]
        save(l, path)


class Users(Model):
    def __init__(self, form):
        self.id = random_str()
        self.username = form.get('username', '')
        self.password = form.get('password', '')


class Requirements(Model):
    def __init__(self, form):
        self.id = form.get('id', None)
        self.province = form.get('province', '')
        self.city = form.get('city', '')
        self.post_content = form.get('post_content', '')
        self.contact_requirement_method = form.get('contact_requirement_method', '')

最后搞定了,采取了下面这种方式,然后有修改了Model部分内容

    if request.method == 'POST':
        formdata = request.form
        form = formdata.to_dict()
        u = Users.new(form)
        u.save()

1.获取客户端提交的表达数据,数据类型为ImmutableMultiDict
formData = request.form
2.将提取的数据转化成字典
formDict = formData.to_dict()
3.提取客户端提交的json字符串
dataJsonString = formDict.keys()[0]
4.将json字符串序列化成字典
dataDict = eval(dataJsonString)

这么干!

很可能没有获取这这str,是一个null 值,null值没有这个属性,所以这边报错了

调试下,你的form是什么类型,是不是字符串了。你的请求怎么写的。

导入String包试试

你的问题出现是由这句代码导致:u = Users.new(form)

Python实例化对象不需要使用.new 直接 u = User(form)

调用str.get之前看看str是不是null了

仔细看告警信息,form变量被当作string字符串了,仔细调试下,看看form在哪里被赋值了

字段初始化错误,没有定义类型

你应该吧这个字符串转换成dict,然后才能get