{"id":237756,"date":"2021-01-01T06:04:57","date_gmt":"2020-12-31T22:04:57","guid":{"rendered":"http:\/\/4563.org\/?p=237756"},"modified":"2021-01-01T06:04:57","modified_gmt":"2020-12-31T22:04:57","slug":"flask-%e6%ba%90%e7%a0%81%e7%b3%bb%e5%88%97%e6%96%87%e7%ab%a0","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=237756","title":{"rendered":"Flask \u6e90\u7801\u7cfb\u5217\u6587\u7ae0"},"content":{"rendered":"<div>\n<div>\n<div>\n<h1>                  Flask \u6e90\u7801\u7cfb\u5217\u6587\u7ae0               <\/h1>\n<p> <\/p>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : johnsona <\/span>  <span><i><\/i> 0<\/span> <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div isfirst=\"1\"> <\/p>\n<p>\u5199\u4e86\u51e0\u7bc7\u5173\u4e8e Flask \u6e90\u7801\u7684\u6587\u7ae0<\/p>\n<p>Flask \u6e90\u7801\u7cfb\u5217<\/p>\n<p>\u4e5f\u53ef\u4ee5\u5173\u6ce8\u6211\u7684\u516c\u4f17\u53f7<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2021\/01\/20210101_5fef650c56293.jpg\" alt=\"Flask \u6e90\u7801\u7cfb\u5217\u6587\u7ae0\" \/><\/p>\n<p>\u6301\u7eed\u66f4\u65b0\u4e2d<\/p>\n<\/p><\/div>\n<div> <b>\u5927\u4f6c\u6709\u8a71\u8aaa<\/b> (<span>11<\/span>)        <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<ul>\n<li data-pid=\"4774925\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : ErwinCheung <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u5f88\u4e0d\u9519\u7684\u6837\u5b50 \u6700\u8fd1\u4e0d\u66f4\u65b0\u4e86\u5417                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774926\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : johnsona <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @ErwinCheung \u4f1a\u628a Flask \u6e90\u7801\u6301\u7eed\u66f4\u65b0\u5b8c                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774927\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : stdout <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             flask \u7684 pycharm \u7684\u81ea\u52a8\u63d0\u793a\u592a\u70c2\u4e86\u3002\u52a8\u6001\u7ed1\u5b9a\u7684\u53d8\u91cf\u548c\u65b9\u6cd5\u5bfc\u81f4\u8865\u5168\u592a\u5dee\u3002\u4e0d\u77e5\u9053\u540e\u671f\u662f\u5426\u4f1a\u6709\u6539\u5584\u3002                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774928\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : johnsona <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @stdout \u52a8\u6001\u7ed1\u5b9a\u7684\u5c5e\u6027\u548c\u65b9\u6cd5\uff0c\u8fd9\u4e2a\u600e\u4e48\u611f\u89c9\u6362\u5176\u4ed6\u6846\u67b6\u4e5f\u4e0d\u597d\u89e3\u51b3\uff0cfastapi \u53ef\u4ee5\u5417                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774929\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : learningman <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @johnsona fastapi \u4e5f\u4e0d\u884c\uff0c\u8fd0\u884c\u65f6\u52a0\u8f7d\u7684\u4e1c\u897f\u60f3\u81ea\u52a8\u8865\u5168\u4f30\u8ba1\u8981\u4e0a AI \u4e86                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774930\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : shroxd <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u6b63\u597d\u60f3\u770b\u770b\u8fd9\u65b9\u9762\u5185\u5bb9\uff0c\u611f\u8c22                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774931\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : stdout <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @johnsona \u8fb9\u770b\u6587\u6863\u8fb9\u5199\uff0c\u6216\u8005\u81ea\u5df1\u62bd\u8c61\u4e00\u5c42\u3002\u6211\u6253\u5305\u7684 base \u53c2\u8003<br \/>&#8220;` <\/p>\n<p>class BaseModel(db.Model):<br \/> __abstract__ = True<\/p>\n<p> create_time = db.Column(db.DateTime, nullable=False, index=True, comment=&#8217;\u521b\u5efa\u65f6\u95f4&#8217;)<br \/> update_time = db.Column(db.DateTime, nullable=False, index=True, comment=&#8217;\u4fee\u6539\u65f6\u95f4&#8217;)<\/p>\n<p> # \u53e6\u5916\u4e00\u79cd\u65b9\u5f0f\u5904\u7406\u81ea\u52a8\u66f4\u65b0<br \/> # created_at = db.Column(db.DateTime, default=sqlalchemy.func.now(), nullable=False)<br \/> # updated_at = db.Column(db.DateTime, default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now(), nullable=False)<\/p>\n<p> @classmethod<br \/> def qry(cls) -&gt; BaseQuery:<br \/> return db.session.query(cls)<\/p>\n<p> @classmethod<br \/> def filter(cls, *args) -&gt; Query:<br \/> return cls.qry().filter(*args)<\/p>\n<p> @classmethod<br \/> def count(cls, rsql=None, sort=None, ignore_fields=None):<br \/> _q = cls.qry().filter(to_db_query_sql(cls, rsql, ignore_fields))<br \/> if sort is not None and sort != &#8221;:<br \/> _q = _q.order_by(to_db_order(cls, sort))<br \/> return _q.count()<\/p>\n<p> @classmethod<br \/> def count_by(cls, **kwargs):<br \/> return cls.qry().filter_by(**kwargs).count()<\/p>\n<p> @classmethod<br \/> def find(cls, rsql=None, sort=None, ignore_fields=None):<br \/> _q = cls.qry().filter(to_db_query_sql(cls, rsql, ignore_fields))<br \/> if sort is not None and sort != &#8221;:<br \/> _q = _q.order_by(to_db_order(cls, sort))<br \/> return _q.all()<\/p>\n<p> @classmethod<br \/> def page_find(cls, page_num, page_size, rsql=None, sort=None, and_sql=None, ignore_fields=None):<br \/> if rsql is None or rsql.strip() == &#8221;:<br \/> rsql = and_sql<br \/> elif and_sql is not None:<br \/> rsql = &#8220;(%s) and (%s)&#8221; % (rsql, and_sql)<br \/> _q = cls.qry().filter(to_db_query_sql(cls, rsql, ignore_fields))<br \/> if sort is not None and sort != &#8221;:<br \/> _q = _q.order_by(to_db_order(cls, sort))<br \/> ret = _q.paginate(page_num, page_size)<br \/> return ret<\/p>\n<p> @classmethod<br \/> def get(cls, _id):<br \/> # print(cls)<br \/> # print(__class__)<br \/> # print(__class__.__dict__)<br \/> # print(__class__.__bases__)<br \/> # print(__class__.__subclasses__())<br \/> return cls.qry().get(_id)<\/p>\n<p> @classmethod<br \/> def delete(cls, _id):<br \/> cls.qry().filter(cls.id == _id).delete()<br \/> db.session.commit()<\/p>\n<p> def save(self):<br \/> try:<br \/> db.session.add(self)<br \/> db.session.flush()<br \/> db.session.commit()<br \/> except BaseException as e:<br \/> _log.error(e)<br \/> db.session.rollback()<\/p>\n<p> @classmethod<br \/> def add(cls, obj, save=True):<br \/> item = None<br \/> _type = type(obj)<br \/> if _type is dict:<br \/> item = cls.from_dict(obj)<br \/> elif _type is cls:<br \/> item = obj<br \/> if item is not None:<br \/> if hasattr(item, &#8216;check&#8217;) and callable(getattr(item, &#8216;check&#8217;)):<br \/> getattr(item, &#8216;check&#8217;)()<br \/> if save:<br \/> item.save()<br \/> return item<\/p>\n<p> def update_from_dict(self, obj, valid_fields=None):<br \/> columns = [m.key for m in self.__table__.columns]<br \/> valid_keys = [k for k in obj.keys() if k in columns]<br \/> item = self.from_dict(obj)<br \/> for k in valid_keys:<br \/> if valid_fields is not None and k not in valid_fields:<br \/> continue<br \/> setattr(self, k, getattr(item, k))<\/p>\n<p> @classmethod<br \/> def update(cls, obj, save=True, valid_fields=None):<br \/> item = None<br \/> _type = type(obj)<br \/> if _type is dict:<br \/> pk = inspect(cls).primary_key[0].name<br \/> if pk not in obj.keys():<br \/> return None<br \/> item = cls.get(obj[pk])<br \/> item.update_from_dict(obj, valid_fields)<br \/> elif _type is cls:<br \/> item = obj<br \/> if item is not None:<br \/> if hasattr(item, &#8216;check&#8217;) and callable(getattr(item, &#8216;check&#8217;)):<br \/> getattr(item, &#8216;check&#8217;)()<br \/> if save:<br \/> item.save()<br \/> return item<\/p>\n<p> @classmethod<br \/> def find_one_by(cls, **kwargs):<br \/> return cls.qry().filter_by(**kwargs).one_or_none()<\/p>\n<p> @classmethod<br \/> def find_first_by(cls, **kwargs):<br \/> return cls.qry().filter_by(**kwargs).first()<\/p>\n<p> @classmethod<br \/> def find_all_by(cls, **kwargs) -&gt; list:<br \/> return cls.qry().filter_by(**kwargs).all()<\/p>\n<p> @classmethod<br \/> def from_dict(cls, obj):<br \/> if type(obj) not in [dict, RowProxy]:<br \/> return None<br \/> _obj = {}<br \/> columns = inspect(cls).columns<br \/> for column in columns:<br \/> if column.name not in obj.keys():<br \/> continue<br \/> obj_value = obj[column.name]<br \/> _type = type(column.type)<br \/> value = obj_value<br \/> if value is None:<br \/> pass<br \/> elif _type is Date:<br \/> value = to_local_datetime(obj_value).date()<br \/> elif _type is DateTime:<br \/> value = to_local_datetime(obj_value)<br \/> elif _type is Boolean:<br \/> if type(value) is str:<br \/> value = value.lower() == &#8216;true&#8217;<br \/> else:<br \/> value = bool(obj_value)<br \/> elif _type is Integer:<br \/> if type(obj_value) is int:<br \/> value = obj_value<br \/> elif type(obj_value) is str:<br \/> if not obj_value.isdigit():<br \/> value = None<br \/> else:<br \/> value = int(obj_value)<br \/> elif _type is Float:<br \/> value = float(obj_value)<br \/> elif _type is int:<br \/> value = int(obj_value)<br \/> elif _type:<br \/> value = str(obj_value)<br \/> _obj[column.name] = value<br \/> # columns = [m.key for m in cls.__table__.columns]<br \/> # _obj = {k: v for k, v in obj.items() if k in columns}<br \/> return cls(**_obj)<\/p>\n<p> def to_dict(self, rel=True, ignore=None):<br \/> &#8220;&#8221;&#8221;Returns the model properties as a dict<\/p>\n<p> :rtype: dict<br \/> &#8220;&#8221;&#8221;<br \/> result = {}<\/p>\n<p> if ignore is None:<br \/> ignore = []<\/p>\n<p> columns = set([attr for attr in dir(self) if not attr.startswith(&#8216;_&#8217;)<br \/> and attr not in ignore<br \/> and attr not in [&#8216;metadata&#8217;, &#8216;query&#8217;, &#8216;query_class&#8217;]<br \/> and not callable(getattr(self, attr))<br \/> ])<br \/> if not rel:<br \/> columns = [m.key for m in self.__table__.columns]<br \/> for attr in columns:<br \/> value = getattr(self, attr)<br \/> if isinstance(value, list):<br \/> result[attr] = list(map(lambda x: x.to_dict() if hasattr(x, &#8220;to_dict&#8221;) else x, value))<br \/> elif hasattr(value, &#8220;to_dict&#8221;):<br \/> result[attr] = value.to_dict()<br \/> elif isinstance(value, dict):<br \/> result[attr] = dict(map(<br \/> lambda item: (item[0], item[1].to_dict())<br \/> if hasattr(item[1], &#8220;to_dict&#8221;) else item,<br \/> value.items()<br \/> ))<br \/> else:<br \/> result[attr] = value<br \/> return result<\/p>\n<p> def to_json(self):<br \/> def extended_encoder(x):<br \/> if isinstance(x, datetime.datetime):<br \/> return x.strftime(&#8220;%Y-%m-%d %H:%M:%S&#8221;)<br \/> if isinstance(x, datetime.date):<br \/> return x.strftime(&#8220;%Y-%m-%d&#8221;)<br \/> if isinstance(x, UUID):<br \/> return str(x)<\/p>\n<p> json_ignore = []<br \/> if hasattr(self, &#8216;_json_ignore&#8217;):<br \/> json_ignore = self._json_ignore<br \/> return json.dumps(self.to_dict(ignore=json_ignore), default=extended_encoder)<\/p>\n<p> @staticmethod<br \/> def result_to_dict(result, keys):<br \/> new_result = []<br \/> for row in result:<br \/> row = dict(zip([attr.name for attr in keys], row))<br \/> new_result.append(row)<br \/> return new_result<br \/>&#8220;`                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774932\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : johnsona <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @stdout \u633a\u597d\u7684\uff0csqlalchemy \u8fd8\u662f\u8981\u624b\u52a8\u5c01\u88c5\u4e00\u4e9b\u4e1c\u897f\u7684<br \/>\u6211\u4e4b\u524d\u8fd8\u8bd5\u8fc7 Marshallmallow \u6765\u628a model \u8f6c\u5316\u4e3a dict \u4ee5\u53ca\u53cd\u5e8f\u5217\u5316\u548c\u6821\u9a8c\u5165\u53c2\uff0c\u66f4\u52a0\u63a5\u8fd1 drf \u4e00\u70b9\uff0c\u4f46\u662f\u522b\u4eba\u53ef\u80fd\u5c31\u8981\u82b1\u591a\u4e00\u4e9b\u65f6\u95f4\u770b Marshallmallow \u7684\u6587\u6863<br \/>\u6240\u4ee5\u6211\u89c9\u5f97\u5176\u5b9e\u8fd9\u6837\u5199\u5c31\u633a\u597d\u4e86                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774933\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : johnsona <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @shroxd \u4e0d\u5ba2\u6c14~                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774934\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : ErwinCheung <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             laoge \u4f60\u8fd9\u4e2a\u4ee3\u7801\u7684\u7f29\u8fdb \u5904\u5973\u5ea7\u65e0\u6cd5\u5fcd\u53d7                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"4774935\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : SjwNo1 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u90a3\u4e48\uff0c\u8c01\u5199\u8fc7\u5206\u6790 django \u6e90\u7801\u7684\u6587\u7ae0                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li>\n","protected":false},"excerpt":{"rendered":"<p>Flask \u6e90\u7801\u7cfb\u5217\u6587\u7ae0 \u8cc7\u6df1\u5927\u4f6c&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/237756"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=237756"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/237756\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=237756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=237756"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=237756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}