Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.041USD
STEEM
0.000STEEM
SBD
0.015SBD
Effective Power
5.001SP
├── Own SP
0.628SP
└── Incoming Deleg
+4.373SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.628SP
Delegated Out
0.000SP
Delegation In
4.373SP
Effective Power
5.001SP
Reward SP (pending)
0.007SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.015SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "1022.746613 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7120.913193 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.015 SBD",
  "conversions": []
}

Account Info

nametmp4321
id728189
rank1,359,963
reputation266047906
created2018-02-06T02:59:12
recovery_accountsteem
proxyNone
post_count49
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-08-02T13:20:00
last_root_post2018-08-02T13:20:00
last_vote_time2018-03-03T14:44:15
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1022.746613 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7120.913193 VESTS
reward_vesting_balance14.267208 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update1970-01-01T00:00:00
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 728189,
  "name": "tmp4321",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6ddztSHnrXNBQsaroMiiStsv7yn9ax8c6RRwJtiy3B9NijyHSB",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7nLpGGfSiqhZjsTev6Zqhu6V1BKDf5Qz7WgdNQdWsG45h7a4PL",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7iiWNebsCsEcFugUYPM7wLhXLE9Y2auZuqszLand8XBpfvREPy",
        1
      ]
    ]
  },
  "memo_key": "STM6UXHvW6ZyyD9VTTRAKEP6V2XH8oL8jfXqdHXRxTMp37JVRFrVz",
  "json_metadata": "",
  "posting_json_metadata": "",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "1970-01-01T00:00:00",
  "created": "2018-02-06T02:59:12",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 49,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779089514
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779089514
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.015 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "14.267208 VESTS",
  "reward_vesting_steem": "0.007 STEEM",
  "vesting_shares": "1022.746613 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7120.913193 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 13,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2018-08-02T13:20:00",
  "last_root_post": "2018-08-02T13:20:00",
  "last_vote_time": "2018-03-03T14:44:15",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": 266047906,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 1359963
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.373 SP to @tmp4321
2026/05/18 07:31:54
delegatorsteem
delegateetmp4321
vesting shares7120.913193 VESTS
Transaction InfoBlock #106152146/Trx 5a68f9f0e5d22016fe63ce591f25b5cf12b4f568
View Raw JSON Data
{
  "trx_id": "5a68f9f0e5d22016fe63ce591f25b5cf12b4f568",
  "block": 106152146,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-18T07:31:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "7120.913193 VESTS"
    }
  ]
}
steemdelegated 2.707 SP to @tmp4321
2026/05/13 09:21:42
delegatorsteem
delegateetmp4321
vesting shares4408.702788 VESTS
Transaction InfoBlock #106011053/Trx 7082b2b23a9129686d943ce0edff30c7a45e8121
View Raw JSON Data
{
  "trx_id": "7082b2b23a9129686d943ce0edff30c7a45e8121",
  "block": 106011053,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-13T09:21:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "4408.702788 VESTS"
    }
  ]
}
steemdelegated 4.381 SP to @tmp4321
2026/04/26 06:42:00
delegatorsteem
delegateetmp4321
vesting shares7133.428949 VESTS
Transaction InfoBlock #105519597/Trx dc8c1f010247296b0394fed7a463c6323df26e2b
View Raw JSON Data
{
  "trx_id": "dc8c1f010247296b0394fed7a463c6323df26e2b",
  "block": 105519597,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-26T06:42:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "7133.428949 VESTS"
    }
  ]
}
steemdelegated 2.733 SP to @tmp4321
2026/01/24 03:21:57
delegatorsteem
delegateetmp4321
vesting shares4450.249607 VESTS
Transaction InfoBlock #102875240/Trx 11e6c3c223aa8c9d1a32fea14e370e4b66154b3f
View Raw JSON Data
{
  "trx_id": "11e6c3c223aa8c9d1a32fea14e370e4b66154b3f",
  "block": 102875240,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-24T03:21:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "4450.249607 VESTS"
    }
  ]
}
steemdelegated 2.834 SP to @tmp4321
2024/12/17 22:30:42
delegatorsteem
delegateetmp4321
vesting shares4614.468804 VESTS
Transaction InfoBlock #91321436/Trx 07f2e84409097c052ea519009dec126d7dbeafb0
View Raw JSON Data
{
  "trx_id": "07f2e84409097c052ea519009dec126d7dbeafb0",
  "block": 91321436,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-17T22:30:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "4614.468804 VESTS"
    }
  ]
}
steemdelegated 2.938 SP to @tmp4321
2023/11/14 14:09:09
delegatorsteem
delegateetmp4321
vesting shares4783.602336 VESTS
Transaction InfoBlock #79875520/Trx b5af27b85341024655de1166222229e3d3aed46b
View Raw JSON Data
{
  "trx_id": "b5af27b85341024655de1166222229e3d3aed46b",
  "block": 79875520,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-14T14:09:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "4783.602336 VESTS"
    }
  ]
}
steemdelegated 4.741 SP to @tmp4321
2023/09/22 11:51:12
delegatorsteem
delegateetmp4321
vesting shares7720.511122 VESTS
Transaction InfoBlock #78364612/Trx 8a7c08e6c94b4cb51e987f230cadc2ab3b11b5b2
View Raw JSON Data
{
  "trx_id": "8a7c08e6c94b4cb51e987f230cadc2ab3b11b5b2",
  "block": 78364612,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-22T11:51:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "7720.511122 VESTS"
    }
  ]
}
steemdelegated 4.878 SP to @tmp4321
2022/11/03 19:08:54
delegatorsteem
delegateetmp4321
vesting shares7942.562560 VESTS
Transaction InfoBlock #69122152/Trx 7f9888e316e9666e32bfaec0053e995f0cfd0d71
View Raw JSON Data
{
  "trx_id": "7f9888e316e9666e32bfaec0053e995f0cfd0d71",
  "block": 69122152,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-03T19:08:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "7942.562560 VESTS"
    }
  ]
}
steemdelegated 5.013 SP to @tmp4321
2022/01/18 00:13:30
delegatorsteem
delegateetmp4321
vesting shares8162.670161 VESTS
Transaction InfoBlock #60825257/Trx 8d1b58aab33975ccd8a6ecdb8648863ec83376d9
View Raw JSON Data
{
  "trx_id": "8d1b58aab33975ccd8a6ecdb8648863ec83376d9",
  "block": 60825257,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-01-18T00:13:30",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "8162.670161 VESTS"
    }
  ]
}
steemdelegated 5.126 SP to @tmp4321
2021/06/14 07:21:21
delegatorsteem
delegateetmp4321
vesting shares8346.864449 VESTS
Transaction InfoBlock #54615515/Trx f6046bfac69800c00ff6f9689b4fe351dfdb8d24
View Raw JSON Data
{
  "trx_id": "f6046bfac69800c00ff6f9689b4fe351dfdb8d24",
  "block": 54615515,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-06-14T07:21:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "8346.864449 VESTS"
    }
  ]
}
steemdelegated 5.241 SP to @tmp4321
2020/12/11 17:32:33
delegatorsteem
delegateetmp4321
vesting shares8534.286423 VESTS
Transaction InfoBlock #49362742/Trx b9436a9fab37b574135c2cd501e349a418ed82c2
View Raw JSON Data
{
  "trx_id": "b9436a9fab37b574135c2cd501e349a418ed82c2",
  "block": 49362742,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T17:32:33",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "8534.286423 VESTS"
    }
  ]
}
steemdelegated 1.175 SP to @tmp4321
2020/12/06 11:07:51
delegatorsteem
delegateetmp4321
vesting shares1912.543513 VESTS
Transaction InfoBlock #49214256/Trx b2279a455d5b4b6ba75c897fc05255193d87d95e
View Raw JSON Data
{
  "trx_id": "b2279a455d5b4b6ba75c897fc05255193d87d95e",
  "block": 49214256,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T11:07:51",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 5.245 SP to @tmp4321
2020/12/05 21:10:24
delegatorsteem
delegateetmp4321
vesting shares8540.494277 VESTS
Transaction InfoBlock #49197824/Trx 97ecc30ad9f5578f9fa3c432b06bd446feba6fe0
View Raw JSON Data
{
  "trx_id": "97ecc30ad9f5578f9fa3c432b06bd446feba6fe0",
  "block": 49197824,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-05T21:10:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "8540.494277 VESTS"
    }
  ]
}
steemdelegated 1.179 SP to @tmp4321
2020/11/03 04:57:03
delegatorsteem
delegateetmp4321
vesting shares1920.017158 VESTS
Transaction InfoBlock #48273474/Trx 9c9106657545e0fd056910edff7672f2f20820e3
View Raw JSON Data
{
  "trx_id": "9c9106657545e0fd056910edff7672f2f20820e3",
  "block": 48273474,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-03T04:57:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "1920.017158 VESTS"
    }
  ]
}
steemdelegated 5.369 SP to @tmp4321
2020/05/09 12:11:57
delegatorsteem
delegateetmp4321
vesting shares8743.299636 VESTS
Transaction InfoBlock #43224602/Trx aed85aa0e6fe210f3f951b856a21611dbfdc8984
View Raw JSON Data
{
  "trx_id": "aed85aa0e6fe210f3f951b856a21611dbfdc8984",
  "block": 43224602,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T12:11:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "8743.299636 VESTS"
    }
  ]
}
steemdelegated 1.200 SP to @tmp4321
2020/05/08 16:46:00
delegatorsteem
delegateetmp4321
vesting shares1953.311140 VESTS
Transaction InfoBlock #43201835/Trx 5f54b191a7df131f407872c33973d35b360cdd6c
View Raw JSON Data
{
  "trx_id": "5f54b191a7df131f407872c33973d35b360cdd6c",
  "block": 43201835,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T16:46:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
2020/02/06 03:42:48
parent authortmp4321
parent permlinkyann-48
authorsteemitboard
permlinksteemitboard-notify-tmp4321-20200206t034247000z
title
bodyCongratulations @tmp4321! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@tmp4321/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@tmp4321) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=tmp4321)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png"></a></td><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator">SteemitBoard Ranking update - A better rich list comparator</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #40571521/Trx c4cfb86e08903d8e86c451cba578e682de7b4b3a
View Raw JSON Data
{
  "trx_id": "c4cfb86e08903d8e86c451cba578e682de7b4b3a",
  "block": 40571521,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-02-06T03:42:48",
  "op": [
    "comment",
    {
      "parent_author": "tmp4321",
      "parent_permlink": "yann-48",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-tmp4321-20200206t034247000z",
      "title": "",
      "body": "Congratulations @tmp4321! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@tmp4321/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@tmp4321) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=tmp4321)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png\"></a></td><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator\">SteemitBoard Ranking update - A better rich list comparator</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 5.435 SP to @tmp4321
2019/11/01 09:51:03
delegatorsteem
delegateetmp4321
vesting shares8849.698719 VESTS
Transaction InfoBlock #37790598/Trx 15b9752e80488ca95ac609867fb797088a233a19
View Raw JSON Data
{
  "trx_id": "15b9752e80488ca95ac609867fb797088a233a19",
  "block": 37790598,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-11-01T09:51:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "8849.698719 VESTS"
    }
  ]
}
2019/02/06 04:26:39
parent authortmp4321
parent permlinkyann-48
authorsteemitboard
permlinksteemitboard-notify-tmp4321-20190206t042638000z
title
bodyCongratulations @tmp4321! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@tmp4321/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@tmp4321)_</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #30100283/Trx 59189b4aa6d82b9cadee8b2509db5ad78d907707
View Raw JSON Data
{
  "trx_id": "59189b4aa6d82b9cadee8b2509db5ad78d907707",
  "block": 30100283,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-02-06T04:26:39",
  "op": [
    "comment",
    {
      "parent_author": "tmp4321",
      "parent_permlink": "yann-48",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-tmp4321-20190206t042638000z",
      "title": "",
      "body": "Congratulations @tmp4321! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@tmp4321/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@tmp4321)_</sub>\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 5.556 SP to @tmp4321
2018/11/26 19:48:15
delegatorsteem
delegateetmp4321
vesting shares9047.174096 VESTS
Transaction InfoBlock #28046706/Trx 669066502c82ba1ed4a2ce4ad3b45c494a1cba3f
View Raw JSON Data
{
  "trx_id": "669066502c82ba1ed4a2ce4ad3b45c494a1cba3f",
  "block": 28046706,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-11-26T19:48:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "9047.174096 VESTS"
    }
  ]
}
steemdelegated 17.990 SP to @tmp4321
2018/09/22 04:42:18
delegatorsteem
delegateetmp4321
vesting shares29294.098997 VESTS
Transaction InfoBlock #26158087/Trx 69c044547d5d47669d1e2408db21ffeaa1684d2a
View Raw JSON Data
{
  "trx_id": "69c044547d5d47669d1e2408db21ffeaa1684d2a",
  "block": 26158087,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-09-22T04:42:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "29294.098997 VESTS"
    }
  ]
}
tmp4321published a new post: yann-48
2018/08/02 13:20:00
parent author
parent permlinkdevops
authortmp4321
permlinkyann-48
title期末总结 - yann学长的运维开发指南48
body### 目前进度 第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度: ![http://www.iamyann.com/images/0802/20180802211116.png](http://www.iamyann.com/images/0802/20180802211116.png) <!--more--> ### 内容介绍 > * 过程梳理 > * 总结 ### 过程梳理 看看我们之前经过的内容 #### 确保功能测试之间相互隔离 这个内容是避免测试信息干扰生产 使用了新的测试类,同时分离了不同的测试用例文件 #### 解决页面刷新延迟 这个内容是代码有故障但没有测试出来 解决方案是升级了一下selenium 同时设置了页面延时,以便抓取故障 #### 使用TDD 实现新设计 该内容没有操作,是讲思路的 主要是避免增加不需要的功能 #### 逐步迭代,实现新设计 主要思路是如何区分不同用户的代办事项 先设计出测试代码,逐步修正 发现需要唯一的路径,发现视图需要匹配那个唯一路由 #### 使用Django测试客户端 一起测试视图、模板和URL 这里说的是client工具,可以替代之前使用的URL,视图,渲染检查 并使用了3个例子来验证client的效果 注意,不同页面应该使用不同的HTML模板 #### 用于添加待办事项的URL和视图 这个是说的是新建页面相关的内容 #### 调整模型 引入了list对象 给.list属性赋值并相与比较 并通过外键实现关联 #### 每个列表都应该有自己的URL 解决清单项目的唯一表示符的问题,以区分不同的清单 捕获URL中传入的参数 使用参数构造new_list视图 #### 待办事项加入现有清单 还需要一个添加页面,就像饭店门口的迎宾一样,让你输入一些东西,用来构建参数 这里还解决了一个表达式问题 #### 使用URL 引入做最后一次重构 在路由上匹配新增页面,同时重构路由模块 ### 总结 两月份开始写的,到7月底总算是到了一个小阶段,现在总结一下 第一个问题就是战线拉的太长, 不说读者,我自己都有些记不清代码的细节,以后再分享打算一周内结束一个主题 第二个问题是再现能力太差,为了手机上的显示效果,我大段代码都是用图片演示的,源文贴的也是一个网站,回头打算放github 第三 感觉通过公众号还是表达能力有限,后期打算只描述一下思想,同学自己去跟随代码的提交查看细节 后面打算会再起一个公众号,说说非it范围内的事情,有些人喜欢在一个公众号里说家常,我很排斥 新的公众号也会在这边公布出来,请 ### 预告 无 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0802/20180802211116.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24715844/Trx c9399307577bcd3f21b7e7e0e1d24c201bd12579
View Raw JSON Data
{
  "trx_id": "c9399307577bcd3f21b7e7e0e1d24c201bd12579",
  "block": 24715844,
  "trx_in_block": 40,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-02T13:20:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-48",
      "title": "期末总结 - yann学长的运维开发指南48",
      "body": "### 目前进度\n第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:\n\n\n![http://www.iamyann.com/images/0802/20180802211116.png](http://www.iamyann.com/images/0802/20180802211116.png)\n<!--more-->\n\n### 内容介绍\n> * 过程梳理\n> * 总结\n\n\n\n\n\n\n\n\n### 过程梳理\n看看我们之前经过的内容\n\n#### 确保功能测试之间相互隔离\n这个内容是避免测试信息干扰生产\n使用了新的测试类,同时分离了不同的测试用例文件\n\n#### 解决页面刷新延迟\n这个内容是代码有故障但没有测试出来\n解决方案是升级了一下selenium\n同时设置了页面延时,以便抓取故障\n\n#### 使用TDD 实现新设计\n该内容没有操作,是讲思路的\n主要是避免增加不需要的功能\n\n#### 逐步迭代,实现新设计\n主要思路是如何区分不同用户的代办事项\n先设计出测试代码,逐步修正\n发现需要唯一的路径,发现视图需要匹配那个唯一路由\n\n#### 使用Django测试客户端\n一起测试视图、模板和URL\n这里说的是client工具,可以替代之前使用的URL,视图,渲染检查\n并使用了3个例子来验证client的效果\n注意,不同页面应该使用不同的HTML模板\n\n#### 用于添加待办事项的URL和视图\n这个是说的是新建页面相关的内容\n\n#### 调整模型\n引入了list对象\n给.list属性赋值并相与比较\n并通过外键实现关联\n\n#### 每个列表都应该有自己的URL\n解决清单项目的唯一表示符的问题,以区分不同的清单\n捕获URL中传入的参数\n使用参数构造new_list视图\n\n#### 待办事项加入现有清单\n还需要一个添加页面,就像饭店门口的迎宾一样,让你输入一些东西,用来构建参数\n这里还解决了一个表达式问题\n\n#### 使用URL 引入做最后一次重构\n在路由上匹配新增页面,同时重构路由模块\n\n### 总结\n两月份开始写的,到7月底总算是到了一个小阶段,现在总结一下\n\n第一个问题就是战线拉的太长, 不说读者,我自己都有些记不清代码的细节,以后再分享打算一周内结束一个主题\n\n第二个问题是再现能力太差,为了手机上的显示效果,我大段代码都是用图片演示的,源文贴的也是一个网站,回头打算放github\n\n第三 感觉通过公众号还是表达能力有限,后期打算只描述一下思想,同学自己去跟随代码的提交查看细节\n\n后面打算会再起一个公众号,说说非it范围内的事情,有些人喜欢在一个公众号里说家常,我很排斥\n\n新的公众号也会在这边公布出来,请\n\n### 预告\n无\n\n\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0802/20180802211116.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: url-yann-47
2018/07/26 08:49:21
parent author
parent permlinkdevops
authortmp4321
permlinkurl-yann-47
title在表单中使用URL - yann学长的运维开发指南47
body### 目前进度 第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度: 确保功能测试之间相互隔离 解决页面刷新延迟 使用TDD 实现新设计 逐步迭代,实现新设计 使用Django测试客户端一起测试视图、模板和URL 用于添加待办事项的URL和视图 调整模型 每个列表都应该有自己的URL 还需要一个视图,把待办事项加入现有清单 使用URL 引入做最后一次重构 ![http://www.iamyann.com/images/0726/20180726164344.png](http://www.iamyann.com/images/0726/20180726164344.png) <!--more--> ### 内容介绍 > * 测试上下文响应 > * 修改测试模块 > * 更新视图 > * 更新模板 > * 尝试功能测试 > * 路由重构 ### 测试上下文响应 修改模板,使用上节配置的URL #### 修改测试模块 视图需要把清单穿入模板,新建一个单元测试方法 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0726/20180726162111.png](http://www.iamyann.com/images/0726/20180726162111.png) 测试一下新建的单元测试 #### 更新视图 ```bash python manage.py test lists # KeyError: 'list' ``` 原因是没有把视图传入模板 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0726/20180726162405.png](http://www.iamyann.com/images/0726/20180726162405.png) #### 更新模板 再次测试 ```bash python manage.py test lists # AssertionError: False is not true : Couldnt find 'itemey 1' in response ``` 模板期望的items没有传入,所以修改模板 ```bash vi lists/templates/list.html ``` ![http://www.iamyann.com/images/0726/20180726162728.png](http://www.iamyann.com/images/0726/20180726162728.png) .item_set是一种反向查询的方法,后面会加以叙述 继续测试 ```bash python manage.py test lists # Ran 9 tests in 0.040s OK ``` 测试通过了 #### 尝试功能测试 再试一下功能测试 ```bash python manage.py test functional_tests # Ran 2 tests in 9.771s OK ``` 功能测试也通过了,貌似工作全完成了 ### 路由重构 superlists/urls.py是站点的路由, 如果是某个应用使用,可以单独配个文件夹 复制路由文件并稍作修改 ```bash cp superlists/urls.py lists/ vi superlists/urls.py ``` ![http://www.iamyann.com/images/0726/20180726163608.png](http://www.iamyann.com/images/0726/20180726163608.png) 在父路由中导入了字路由并别名list_urls ```bash vi lists/urls.py ``` ![http://www.iamyann.com/images/0726/20180726163737.png](http://www.iamyann.com/images/0726/20180726163737.png) list部分的URL已近放在父路由里面了,这里只要写另一半就好 再次测试,测试通过 ### 预告 终于完成了,下次会梳理总结一下,然后django部分结束 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0726/20180726164344.png","http://www.iamyann.com/images/0726/20180726162111.png","http://www.iamyann.com/images/0726/20180726162405.png","http://www.iamyann.com/images/0726/20180726162728.png","http://www.iamyann.com/images/0726/20180726163608.png","http://www.iamyann.com/images/0726/20180726163737.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24509393/Trx 1d309099f8fb8c78623ce5e1ca1590fc293dea12
View Raw JSON Data
{
  "trx_id": "1d309099f8fb8c78623ce5e1ca1590fc293dea12",
  "block": 24509393,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-26T08:49:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "url-yann-47",
      "title": "在表单中使用URL - yann学长的运维开发指南47",
      "body": "### 目前进度\n第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:\n\n确保功能测试之间相互隔离\n解决页面刷新延迟\n使用TDD 实现新设计\n逐步迭代,实现新设计\n使用Django测试客户端一起测试视图、模板和URL\n用于添加待办事项的URL和视图\n调整模型\n每个列表都应该有自己的URL\n还需要一个视图,把待办事项加入现有清单\n使用URL 引入做最后一次重构\n\n![http://www.iamyann.com/images/0726/20180726164344.png](http://www.iamyann.com/images/0726/20180726164344.png)\n<!--more-->\n\n### 内容介绍\n> * 测试上下文响应\n> * 修改测试模块\n> * 更新视图\n> * 更新模板\n> * 尝试功能测试\n> * 路由重构\n\n\n\n\n\n\n\n### 测试上下文响应\n修改模板,使用上节配置的URL\n#### 修改测试模块\n视图需要把清单穿入模板,新建一个单元测试方法\n\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0726/20180726162111.png](http://www.iamyann.com/images/0726/20180726162111.png)\n\n测试一下新建的单元测试\n\n#### 更新视图\n\n```bash\npython manage.py test lists\n#\nKeyError: 'list'\n```\n\n原因是没有把视图传入模板\n```bash\nvi lists/views.py\n```\n\n![http://www.iamyann.com/images/0726/20180726162405.png](http://www.iamyann.com/images/0726/20180726162405.png)\n\n#### 更新模板\n再次测试\n\n```bash\npython manage.py test lists\n#\nAssertionError: False is not true : Couldnt find 'itemey 1' in response\n```\n模板期望的items没有传入,所以修改模板\n\n```bash\nvi lists/templates/list.html\n```\n\n![http://www.iamyann.com/images/0726/20180726162728.png](http://www.iamyann.com/images/0726/20180726162728.png)\n\n.item_set是一种反向查询的方法,后面会加以叙述\n\n继续测试\n```bash\npython manage.py test lists\n#\nRan 9 tests in 0.040s\n\nOK\n```\n测试通过了\n\n#### 尝试功能测试\n再试一下功能测试\n\n```bash\npython manage.py test functional_tests\n#\nRan 2 tests in 9.771s\n\nOK\n```\n\n功能测试也通过了,貌似工作全完成了\n\n\n### 路由重构\nsuperlists/urls.py是站点的路由, 如果是某个应用使用,可以单独配个文件夹\n\n复制路由文件并稍作修改\n```bash\ncp superlists/urls.py lists/\nvi superlists/urls.py\n```\n\n![http://www.iamyann.com/images/0726/20180726163608.png](http://www.iamyann.com/images/0726/20180726163608.png)\n\n在父路由中导入了字路由并别名list_urls  \n```bash\nvi lists/urls.py\n```\n\n![http://www.iamyann.com/images/0726/20180726163737.png](http://www.iamyann.com/images/0726/20180726163737.png)\n\nlist部分的URL已近放在父路由里面了,这里只要写另一半就好\n\n\n再次测试,测试通过\n\n\n### 预告\n终于完成了,下次会梳理总结一下,然后django部分结束\n\n\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0726/20180726164344.png\",\"http://www.iamyann.com/images/0726/20180726162111.png\",\"http://www.iamyann.com/images/0726/20180726162405.png\",\"http://www.iamyann.com/images/0726/20180726162728.png\",\"http://www.iamyann.com/images/0726/20180726163608.png\",\"http://www.iamyann.com/images/0726/20180726163737.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: url-yann-46
2018/07/24 10:41:18
parent author
parent permlinkdevops
authortmp4321
permlinkurl-yann-46
title新增项目的URL - yann学长的运维开发指南46
body### 目前进度 第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度: 确保功能测试之间相互隔离 解决页面刷新延迟 使用TDD 实现新设计 逐步迭代,实现新设计 使用Django测试客户端一起测试视图、模板和URL 用于添加待办事项的URL和视图 调整模型 每个列表都应该有自己的URL 还需要一个视图,把待办事项加入现有清单 ![http://www.iamyann.com/images/0724/20180724182726.png](http://www.iamyann.com/images/0724/20180724182726.png) <!--more--> ### 内容介绍 > * 把代办事项加入现有清单 > * 先写测试项 > * 检查正则表达试 > * 更新正则表达式 > * 最后的新路由 > * 再次更新视图 > * 测试修改成果 > * 按照设计调整new_list视图 > * 配置重定向 > * 配置试图提交 ### 把代办事项加入现有清单 给新增事项用的视图 #### 先写测试项 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0724/20180724172514.png](http://www.iamyann.com/images/0724/20180724172514.png) 测试能否保存内容并跳转到新页面 #### 检查正则表达试 测试一下,应该会有404出现 ```bash python manage.py test lists # AssertionError: 301 != 302 : Response didn t redirect as expected: Response code was 301 (expected 302) ``` 还没有设置URL,应该是404,为什么会301呢 查看一下URL的配置 ```bash vi superlists/urls.py ``` ```python url(r'^lists/(.+)/$', views.view_list, name='view_list'), ``` 正则表达式的范围太大了 #### 更新正则表达式 把URL传入视图 ```bash vi superlists/urls.py ``` ![http://www.iamyann.com/images/0724/20180724173337.png](http://www.iamyann.com/images/0724/20180724173337.png) 更新正则表达式,只匹配数字 继续测试 ```bash python manage.py test lists # AssertionError: 404 != 302 : Response didn t redirect as expected: Response code was 404 (expected 302) ``` 符合期望值,测试成功 #### 最后的新路由 定义新路由用于新增项目 ```bash vi superlists/urls.py ``` ![http://www.iamyann.com/images/0724/20180724173856.png](http://www.iamyann.com/images/0724/20180724173856.png) ### 再次更新视图 再次测试, 报错有了变化 ```bash python manage.py test lists # AttributeError: module 'lists.views' has no attribute 'add_item' ``` 添加视图 ```bash vi lists/views.py ``` ```python def add_item(request): pass ``` 报错 ```bash python manage.py test lists # TypeError: add_item() takes 1 positional argument but 2 were given ``` #### 测试修改成果 再测试一下 ```bash vi lists/views.py ``` ```python def add_item(request, list_id): pass ``` 报错 ```bash python manage.py test lists # ValueError: The view lists.views.add_item didn t return an HttpResponse object. ``` ### 按照设计调整new_list视图 修改测试 ```bash def add_item(request, list_id): pass ``` 报错 ```bash python manage.py test lists # self.assertEqual(Item.objects.count(), 1) AssertionError: 0 != 1 ``` #### 配置重定向 ```bash vi lists/views.py ``` 重定向到有效地址 ![http://www.iamyann.com/images/0724/20180724181154.png](http://www.iamyann.com/images/0724/20180724181154.png) #### 配置试图提交 再次测试 ```bash python manage.py test lists # self.assertEqual(Item.objects.count(), 1) AssertionError: 0 != 1 ``` ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0724/20180724181757.png](http://www.iamyann.com/images/0724/20180724181757.png) 补充上提交语句,测试通过 ### 预告 今天的内容也差不多了,下次会再调整一下视图文件,敬请期待 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0724/20180724182726.png","http://www.iamyann.com/images/0724/20180724172514.png","http://www.iamyann.com/images/0724/20180724173337.png","http://www.iamyann.com/images/0724/20180724173856.png","http://www.iamyann.com/images/0724/20180724181154.png","http://www.iamyann.com/images/0724/20180724181757.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24454064/Trx a942a0398967149fca31a77069c6dde6220029a1
View Raw JSON Data
{
  "trx_id": "a942a0398967149fca31a77069c6dde6220029a1",
  "block": 24454064,
  "trx_in_block": 53,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-24T10:41:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "url-yann-46",
      "title": "新增项目的URL - yann学长的运维开发指南46",
      "body": "### 目前进度\n第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:\n\n确保功能测试之间相互隔离\n解决页面刷新延迟\n使用TDD 实现新设计\n逐步迭代,实现新设计\n使用Django测试客户端一起测试视图、模板和URL\n用于添加待办事项的URL和视图\n调整模型\n每个列表都应该有自己的URL\n还需要一个视图,把待办事项加入现有清单\n\n\n![http://www.iamyann.com/images/0724/20180724182726.png](http://www.iamyann.com/images/0724/20180724182726.png)\n<!--more-->\n\n### 内容介绍\n> * 把代办事项加入现有清单\n> * 先写测试项\n> * 检查正则表达试\n> * 更新正则表达式\n> * 最后的新路由\n> * 再次更新视图\n> * 测试修改成果\n> * 按照设计调整new_list视图\n> * 配置重定向\n> * 配置试图提交\n\n\n\n\n\n\n### 把代办事项加入现有清单\n给新增事项用的视图\n#### 先写测试项\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0724/20180724172514.png](http://www.iamyann.com/images/0724/20180724172514.png)\n\n测试能否保存内容并跳转到新页面\n\n#### 检查正则表达试\n测试一下,应该会有404出现\n\n```bash\npython manage.py test lists\n#\nAssertionError: 301 != 302 : Response didn t redirect as expected: Response\ncode was 301 (expected 302)\n```\n\n还没有设置URL,应该是404,为什么会301呢\n查看一下URL的配置\n```bash\nvi superlists/urls.py\n```\n```python\nurl(r'^lists/(.+)/$', views.view_list, name='view_list'),\n```\n正则表达式的范围太大了\n\n#### 更新正则表达式\n把URL传入视图\n\n```bash\nvi superlists/urls.py\n```\n\n![http://www.iamyann.com/images/0724/20180724173337.png](http://www.iamyann.com/images/0724/20180724173337.png)\n\n更新正则表达式,只匹配数字\n\n继续测试\n```bash\npython manage.py test lists\n#\nAssertionError: 404 != 302 : Response didn t redirect as expected: Response\ncode was 404 (expected 302)\n```\n符合期望值,测试成功\n\n#### 最后的新路由\n定义新路由用于新增项目\n\n```bash\nvi superlists/urls.py\n```\n\n![http://www.iamyann.com/images/0724/20180724173856.png](http://www.iamyann.com/images/0724/20180724173856.png)\n\n\n### 再次更新视图\n再次测试, 报错有了变化\n\n```bash\npython manage.py test lists\n#\nAttributeError: module 'lists.views' has no attribute 'add_item'\n```\n\n添加视图\n```bash\nvi lists/views.py\n```\n```python\ndef add_item(request):\n    pass\n```\n报错\n```bash\npython manage.py test lists\n#\nTypeError: add_item() takes 1 positional argument but 2 were given\n```\n#### 测试修改成果\n再测试一下\n```bash\nvi lists/views.py\n```\n```python\ndef add_item(request, list_id):\n    pass\n```\n报错\n```bash\npython manage.py test lists\n#\nValueError: The view lists.views.add_item didn t return an HttpResponse object.\n```\n\n### 按照设计调整new_list视图\n修改测试\n```bash\ndef add_item(request, list_id):\n    pass\n```\n\n报错\n```bash\npython manage.py test lists\n#\nself.assertEqual(Item.objects.count(), 1)\nAssertionError: 0 != 1\n```\n\n#### 配置重定向\n\n```bash\nvi lists/views.py\n```\n重定向到有效地址\n\n![http://www.iamyann.com/images/0724/20180724181154.png](http://www.iamyann.com/images/0724/20180724181154.png)\n\n#### 配置试图提交\n\n再次测试\n```bash\npython manage.py test lists\n#\nself.assertEqual(Item.objects.count(), 1)\nAssertionError: 0 != 1\n```\n\n```bash\nvi lists/views.py\n```\n\n![http://www.iamyann.com/images/0724/20180724181757.png](http://www.iamyann.com/images/0724/20180724181757.png)\n\n补充上提交语句,测试通过\n\n\n### 预告\n今天的内容也差不多了,下次会再调整一下视图文件,敬请期待\n\n\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0724/20180724182726.png\",\"http://www.iamyann.com/images/0724/20180724172514.png\",\"http://www.iamyann.com/images/0724/20180724173337.png\",\"http://www.iamyann.com/images/0724/20180724173856.png\",\"http://www.iamyann.com/images/0724/20180724181154.png\",\"http://www.iamyann.com/images/0724/20180724181757.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: url-yann-45
2018/07/19 12:59:42
parent author
parent permlinkdevops
authortmp4321
permlinkurl-yann-45
title给列表自己的URL - yann学长的运维开发指南45
body### 目前进度 第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度: 确保功能测试之间相互隔离 解决页面刷新延迟 使用TDD 实现新设计 逐步迭代,实现新设计 使用Django测试客户端一起测试视图、模板和URL 用于添加待办事项的URL和视图 调整模型 每个列表都应该有自己的URL ![http://www.iamyann.com/images/0719/20180719205349.png](http://www.iamyann.com/images/0719/20180719205349.png) <!--more--> ### 内容介绍 > * 给列表自己的URL > * 更新测试 > * 测试一下 > * 捕获URL > * 更新视图文件 > * 再次更新视图 > * 测试修改成果 > * 按照设计调整new_list视图 > * 进行功能测试 ### 给列表自己的URL 给每个列表自己的URL就是需要有唯一的标识符,比如数据库的id字段 #### 更新测试 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0719/20180719200530.png](http://www.iamyann.com/images/0719/20180719200530.png) 把test_displays_all_items修改成 test_displays_only_items_for_that_list #### 测试一下 测试一下,应该会有404出现 ```bash python manage.py test lists # AssertionError: 404 != 200 : Couldn t retrieve content: Response code was 404 (expected 200) ``` #### 捕获URL 把URL传入视图 ```bash vi superlists/urls.py ``` ![http://www.iamyann.com/images/0719/20180719201319.png](http://www.iamyann.com/images/0719/20180719201319.png) 调整URL中的正则表达式,加入捕获组,匹配 "/"后的任意字符,传入视图 继续测试 ```bash python manage.py test lists # TypeError: view_list() takes 1 positional argument but 2 were given ``` #### 更新视图文件 ```bash vi lists/views.py ``` ```python def view_list(request, list_id): ``` ### 再次更新视图 再次测试, 报错有了变化 ```bash python manage.py test lists # AssertionError: 1 != 0 : Response should not contain 'other list item 1' ``` 报警符合预期,把代办事项传入模板 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0719/20180719202303.png](http://www.iamyann.com/images/0719/20180719202303.png) #### 测试修改成果 再测试一下 ```bash python manage.py test lists # ERROR: test_redirects_after_POST (lists.tests.NewListTest) ValueError: invalid literal for int() with base 10: 'the-only-list-in-the-world' ``` ### 按照设计调整new_list视图 修改测试 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0719/20180719203824.png](http://www.iamyann.com/images/0719/20180719203824.png) 检查是否定义到新URL 测试之后发现仍然报错,再修改一下 ```bash vi lists/tests.py ``` 重定向到有效地址 ![http://www.iamyann.com/images/0719/20180719204040.png](http://www.iamyann.com/images/0719/20180719204040.png) 再次测试通过 #### 进行功能测试 ```bash python manage.py test functional_tests # AssertionError: '2: Use peacock feathers to make a fly' not found in ['1: Use peacock feathers to make a fly'] ``` 功能测试还是有故障,下节再修复 ### 预告 今天的内容也差不多了,下次会再调整一下视图文件,敬请期待 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0719/20180719205349.png","http://www.iamyann.com/images/0719/20180719200530.png","http://www.iamyann.com/images/0719/20180719201319.png","http://www.iamyann.com/images/0719/20180719202303.png","http://www.iamyann.com/images/0719/20180719203824.png","http://www.iamyann.com/images/0719/20180719204040.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24312933/Trx e7a9d57c25c60613155525054d98c583c013a461
View Raw JSON Data
{
  "trx_id": "e7a9d57c25c60613155525054d98c583c013a461",
  "block": 24312933,
  "trx_in_block": 37,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-19T12:59:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "url-yann-45",
      "title": "给列表自己的URL - yann学长的运维开发指南45",
      "body": "### 目前进度\n第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:\n\n确保功能测试之间相互隔离\n解决页面刷新延迟\n使用TDD 实现新设计\n逐步迭代,实现新设计\n使用Django测试客户端一起测试视图、模板和URL\n用于添加待办事项的URL和视图\n调整模型\n每个列表都应该有自己的URL\n\n\n![http://www.iamyann.com/images/0719/20180719205349.png](http://www.iamyann.com/images/0719/20180719205349.png)\n<!--more-->\n\n### 内容介绍\n> * 给列表自己的URL\n> * 更新测试\n> * 测试一下\n> * 捕获URL\n> * 更新视图文件\n> * 再次更新视图\n> * 测试修改成果\n> * 按照设计调整new_list视图\n> * 进行功能测试\n\n\n\n\n\n### 给列表自己的URL\n给每个列表自己的URL就是需要有唯一的标识符,比如数据库的id字段\n#### 更新测试\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0719/20180719200530.png](http://www.iamyann.com/images/0719/20180719200530.png)\n\n把test_displays_all_items修改成  test_displays_only_items_for_that_list\n\n#### 测试一下\n测试一下,应该会有404出现\n\n```bash\npython manage.py test lists\n#\nAssertionError: 404 != 200 : Couldn t retrieve content: Response code was 404\n(expected 200)\n```\n\n#### 捕获URL\n把URL传入视图\n\n```bash\nvi superlists/urls.py\n```\n\n![http://www.iamyann.com/images/0719/20180719201319.png](http://www.iamyann.com/images/0719/20180719201319.png)\n\n调整URL中的正则表达式,加入捕获组,匹配 \"/\"后的任意字符,传入视图\n\n继续测试\n```bash\npython manage.py test lists\n#\nTypeError: view_list() takes 1 positional argument but 2 were given\n```\n\n#### 更新视图文件\n\n```bash\nvi lists/views.py\n```\n```python\ndef view_list(request, list_id):\n```\n\n### 再次更新视图\n再次测试, 报错有了变化\n\n```bash\npython manage.py test lists\n#\nAssertionError: 1 != 0 : Response should not contain 'other list item 1'\n```\n报警符合预期,把代办事项传入模板\n```bash\nvi lists/views.py\n```\n\n![http://www.iamyann.com/images/0719/20180719202303.png](http://www.iamyann.com/images/0719/20180719202303.png)\n\n#### 测试修改成果\n再测试一下\n```bash\npython manage.py test lists\n#\nERROR: test_redirects_after_POST (lists.tests.NewListTest)\nValueError: invalid literal for int() with base 10:\n'the-only-list-in-the-world'\n```\n\n### 按照设计调整new_list视图\n修改测试\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0719/20180719203824.png](http://www.iamyann.com/images/0719/20180719203824.png)\n检查是否定义到新URL\n测试之后发现仍然报错,再修改一下\n\n```bash\nvi lists/tests.py\n```\n重定向到有效地址\n\n![http://www.iamyann.com/images/0719/20180719204040.png](http://www.iamyann.com/images/0719/20180719204040.png)\n\n\n再次测试通过\n\n#### 进行功能测试\n```bash\npython manage.py test functional_tests\n#\nAssertionError: '2: Use peacock feathers to make a fly' not found in ['1: Use\npeacock feathers to make a fly']\n```\n功能测试还是有故障,下节再修复\n### 预告\n今天的内容也差不多了,下次会再调整一下视图文件,敬请期待\n\n\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0719/20180719205349.png\",\"http://www.iamyann.com/images/0719/20180719200530.png\",\"http://www.iamyann.com/images/0719/20180719201319.png\",\"http://www.iamyann.com/images/0719/20180719202303.png\",\"http://www.iamyann.com/images/0719/20180719203824.png\",\"http://www.iamyann.com/images/0719/20180719204040.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-44
2018/07/12 12:35:00
parent author
parent permlinkdevops
authortmp4321
permlinkyann-44
title调整模型 - yann学长的运维开发指南44
body### 目前进度 第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度: 确保功能测试之间相互隔离 解决页面刷新延迟 使用TDD 实现新设计 逐步迭代,实现新设计 使用Django测试客户端一起测试视图、模板和URL 用于添加待办事项的URL和视图 调整模型 ![http://www.iamyann.com/images/0711/20180711142109.png](http://www.iamyann.com/images/0711/20180711142109.png) <!--more--> ### 内容介绍 > * 调整模型 > * 调整测试 > * 故障排除 > * 迁移数据库 > * 用外键实现关联 > * 测试修改成果 > * 根据模型调整代码 > * 修正第一个错误 > * 修正其他错误 ### 调整模型 前面做了很多修改,现在调整一下,让代码更好看一点 #### 调整测试 先看视图部分 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0711/20180711111448.png](http://www.iamyann.com/images/0711/20180711111448.png) 新建了一个list对象,通过给.list属性赋值把代办事项归在对象下面 list是关键字,所以写成list_区别 对比数据库中保存的值和list_的值 #### 故障排除 修改了测试类后,会出现许多熟悉的错误 让我们来一一排查 ```bash python manage.py test lists # ImportError: cannot import name 'List' ``` 需要在models.py里建一个Item类 ```bash python manage.py test lists # AttributeError: 'List' object has no attribute 'save' ``` 没有save属性,object改为继承model类 ```bash python manage.py test lists # django.db.utils.OperationalError: no such table: lists_list ``` 数据库相关的故障 #### 迁移数据库 ```bash python manage.py makemigrations # self.assertEqual(first_saved_item.list, list_) AttributeError: 'Item' object has no attribute 'list' ``` ### 用外键实现关联 Item没有list属性,要想办法实现 先做个text属性试试 ```bash vi lists/models.py ``` ![http://www.iamyann.com/images/0711/20180711114050.png](http://www.iamyann.com/images/0711/20180711114050.png) #### 测试修改成果 ```bash python manage.py test lists # django.db.utils.OperationalError: no such column: lists_item.list ``` 迁移一下 ```bash python manage.py makemigrations # AssertionError: 'List object' != <List: List object> ``` Django只保存了list对象的字符串形式 如果要保存对象之间的关系需要用外键 ```bash vi lists/models.py ``` ![http://www.iamyann.com/images/0711/20180711134002.png](http://www.iamyann.com/images/0711/20180711134002.png) 再做一次数据库迁移 ```bash rm lists/migrations/0004_item_list.py python manage.py makemigrations ``` ### 根据模型调整代码 ```bash python manage.py test lists # ERROR: test_displays_all_items (lists.tests.ListViewTest) django.db.utils.IntegrityError: NOT NULL constraint failed: lists_item.list_id ...... ``` #### 修正第一个错误 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0711/20180711141111.png](http://www.iamyann.com/images/0711/20180711141111.png) 为代办事项创建父清单 #### 修正其他错误 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0711/20180711141424.png](http://www.iamyann.com/images/0711/20180711141424.png) 调用代办事项的父清单 修改之后测试通过 ### 预告 今天的内容也差不多了,下次会修改另一个内容,敬请期待 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0711/20180711142109.png","http://www.iamyann.com/images/0711/20180711111448.png","http://www.iamyann.com/images/0711/20180711114050.png","http://www.iamyann.com/images/0711/20180711134002.png","http://www.iamyann.com/images/0711/20180711141111.png","http://www.iamyann.com/images/0711/20180711141424.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24110957/Trx 328c65a57c4c8914702485b813edeab9f23b3ed5
View Raw JSON Data
{
  "trx_id": "328c65a57c4c8914702485b813edeab9f23b3ed5",
  "block": 24110957,
  "trx_in_block": 29,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-12T12:35:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-44",
      "title": "调整模型 - yann学长的运维开发指南44",
      "body": "### 目前进度\n第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:\n\n确保功能测试之间相互隔离\n解决页面刷新延迟\n使用TDD 实现新设计\n逐步迭代,实现新设计\n使用Django测试客户端一起测试视图、模板和URL\n用于添加待办事项的URL和视图\n调整模型\n\n\n![http://www.iamyann.com/images/0711/20180711142109.png](http://www.iamyann.com/images/0711/20180711142109.png)\n<!--more-->\n\n### 内容介绍\n> * 调整模型\n> * 调整测试\n> * 故障排除\n> * 迁移数据库\n> * 用外键实现关联\n> * 测试修改成果\n> * 根据模型调整代码\n> * 修正第一个错误\n> * 修正其他错误\n\n\n\n\n### 调整模型\n前面做了很多修改,现在调整一下,让代码更好看一点\n#### 调整测试\n先看视图部分\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0711/20180711111448.png](http://www.iamyann.com/images/0711/20180711111448.png)\n\n新建了一个list对象,通过给.list属性赋值把代办事项归在对象下面\nlist是关键字,所以写成list_区别\n\n对比数据库中保存的值和list_的值\n\n#### 故障排除\n修改了测试类后,会出现许多熟悉的错误\n让我们来一一排查\n\n```bash\npython manage.py test lists\n#\nImportError: cannot import name 'List'\n```\n需要在models.py里建一个Item类\n\n```bash\npython manage.py test lists\n#\nAttributeError: 'List' object has no attribute 'save'\n```\n没有save属性,object改为继承model类\n\n```bash\npython manage.py test lists\n#\ndjango.db.utils.OperationalError: no such table: lists_list\n```\n数据库相关的故障\n\n#### 迁移数据库\n\n```bash\npython manage.py makemigrations\n#\nself.assertEqual(first_saved_item.list, list_)\nAttributeError: 'Item' object has no attribute 'list'\n```\n\n### 用外键实现关联\nItem没有list属性,要想办法实现\n先做个text属性试试\n\n```bash\nvi lists/models.py\n```\n\n![http://www.iamyann.com/images/0711/20180711114050.png](http://www.iamyann.com/images/0711/20180711114050.png)\n\n#### 测试修改成果\n```bash\npython manage.py test lists\n#\ndjango.db.utils.OperationalError: no such column: lists_item.list\n```\n迁移一下\n\n```bash\npython manage.py makemigrations\n#\nAssertionError: 'List object' != <List: List object>\n```\n\nDjango只保存了list对象的字符串形式\n如果要保存对象之间的关系需要用外键\n\n```bash\nvi lists/models.py\n```\n\n![http://www.iamyann.com/images/0711/20180711134002.png](http://www.iamyann.com/images/0711/20180711134002.png)\n\n\n再做一次数据库迁移\n```bash\nrm lists/migrations/0004_item_list.py\npython manage.py makemigrations\n```\n### 根据模型调整代码\n```bash\npython manage.py test lists\n#\nERROR: test_displays_all_items (lists.tests.ListViewTest)\ndjango.db.utils.IntegrityError: NOT NULL constraint failed: lists_item.list_id\n......\n```\n\n#### 修正第一个错误\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0711/20180711141111.png](http://www.iamyann.com/images/0711/20180711141111.png)\n\n为代办事项创建父清单\n\n#### 修正其他错误\n```bash\nvi lists/views.py\n```\n\n![http://www.iamyann.com/images/0711/20180711141424.png](http://www.iamyann.com/images/0711/20180711141424.png)\n\n调用代办事项的父清单\n修改之后测试通过\n\n### 预告\n今天的内容也差不多了,下次会修改另一个内容,敬请期待\n\n\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0711/20180711142109.png\",\"http://www.iamyann.com/images/0711/20180711111448.png\",\"http://www.iamyann.com/images/0711/20180711114050.png\",\"http://www.iamyann.com/images/0711/20180711134002.png\",\"http://www.iamyann.com/images/0711/20180711141111.png\",\"http://www.iamyann.com/images/0711/20180711141424.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/10 03:23:24
voterfastresteem
authortmp4321
permlinkurl-yann-43
weight100 (1.00%)
Transaction InfoBlock #24042342/Trx 27c5695e63165f21ec7f110d5fe57083c80ac721
View Raw JSON Data
{
  "trx_id": "27c5695e63165f21ec7f110d5fe57083c80ac721",
  "block": 24042342,
  "trx_in_block": 44,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-10T03:23:24",
  "op": [
    "vote",
    {
      "voter": "fastresteem",
      "author": "tmp4321",
      "permlink": "url-yann-43",
      "weight": 100
    }
  ]
}
tmp4321published a new post: url-yann-43
2018/07/10 03:23:15
parent author
parent permlinkdevops
authortmp4321
permlinkurl-yann-43
title表单指向添加的URL - yann学长的运维开发指南43
body### 目前进度 第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度: 确保功能测试之间相互隔离 解决页面刷新延迟 使用TDD 实现新设计 逐步迭代,实现新设计 使用Django测试客户端一起测试视图、模板和URL 用于添加待办事项的URL和视图 ![http://www.iamyann.com/images/0705/20180710110213.png](http://www.iamyann.com/images/0705/20180710110213.png) <!--more--> ### 内容介绍 > * 删除冗余代码 > * 删除代码 > * 删除测试 > * 表单指向新URL ### 删除冗余代码 基于前面的测试, 部分构建视图时的代码可以删除了 #### 删除代码 先看视图部分 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0705/20180705153957.png](http://www.iamyann.com/images/0705/20180705153957.png) 删除request.method == 'POST'相关的3条判断语句 #### 删除测试 删除 test_only_saves_​items_when_necessary 方法 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0705/20180705163954.png](http://www.iamyann.com/images/0705/20180705163954.png) 再次测试 ```bash python manage.py test lists Ran 6 tests in 0.016s OK ``` ### 表单指向新URL 运行功能测试 ```bash python manage.py test functional_tests ERROR: test_can_start_a_list_for_one_user ERROR: test_multiple_users_can_start_lists_at_different_urls ``` 原因是表单的指向尚未修改 ```bash vi lists/templates/home.html ``` ![http://www.iamyann.com/images/0706/20180706182411.png](http://www.iamyann.com/images/0706/20180706182411.png) ```bash vi lists/templates/list.html ``` ![http://www.iamyann.com/images/0706/20180706182717.png](http://www.iamyann.com/images/0706/20180706182717.png) 再次测试,恢复之前的报错,修改成功 ```bash python manage.py test functional_tests AssertionError: '1: Buy milk' not found in ['1: Buy peacock feathers', '2: Buy milk'] ``` 测试通过 ### 预告 今天的内容也差不多了,下次会调整一下代码,毕竟也修改了很多次 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0705/20180710110213.png","http://www.iamyann.com/images/0705/20180705153957.png","http://www.iamyann.com/images/0705/20180705163954.png","http://www.iamyann.com/images/0706/20180706182411.png","http://www.iamyann.com/images/0706/20180706182717.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24042339/Trx 69aa4a2ef148c15fb9b49bab3bed763d24b9305a
View Raw JSON Data
{
  "trx_id": "69aa4a2ef148c15fb9b49bab3bed763d24b9305a",
  "block": 24042339,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-10T03:23:15",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "url-yann-43",
      "title": "表单指向添加的URL - yann学长的运维开发指南43",
      "body": "### 目前进度\n第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:\n\n确保功能测试之间相互隔离\n解决页面刷新延迟\n使用TDD 实现新设计\n逐步迭代,实现新设计\n使用Django测试客户端一起测试视图、模板和URL\n用于添加待办事项的URL和视图\n\n\n![http://www.iamyann.com/images/0705/20180710110213.png](http://www.iamyann.com/images/0705/20180710110213.png)\n<!--more-->\n\n### 内容介绍\n> * 删除冗余代码\n> * 删除代码\n> * 删除测试\n> * 表单指向新URL\n\n\n\n### 删除冗余代码\n基于前面的测试, 部分构建视图时的代码可以删除了\n#### 删除代码\n先看视图部分\n```bash\nvi lists/views.py\n```\n\n![http://www.iamyann.com/images/0705/20180705153957.png](http://www.iamyann.com/images/0705/20180705153957.png)\n\n删除request.method == 'POST'相关的3条判断语句\n\n#### 删除测试\n删除 test_only_saves_​items_when_necessary 方法\n\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0705/20180705163954.png](http://www.iamyann.com/images/0705/20180705163954.png)\n\n再次测试\n\n```bash\npython manage.py test lists\n\nRan 6 tests in 0.016s\nOK\n```\n\n### 表单指向新URL\n运行功能测试\n\n```bash\npython manage.py test functional_tests\n\nERROR: test_can_start_a_list_for_one_user\n\nERROR: test_multiple_users_can_start_lists_at_different_urls\n\n```\n原因是表单的指向尚未修改\n```bash\nvi lists/templates/home.html\n```\n\n![http://www.iamyann.com/images/0706/20180706182411.png](http://www.iamyann.com/images/0706/20180706182411.png)\n\n```bash\nvi lists/templates/list.html\n```\n\n![http://www.iamyann.com/images/0706/20180706182717.png](http://www.iamyann.com/images/0706/20180706182717.png)\n\n\n再次测试,恢复之前的报错,修改成功\n```bash\npython manage.py test functional_tests\n\nAssertionError: '1: Buy milk' not found in ['1: Buy peacock feathers', '2: Buy\nmilk']\n```\n\n测试通过\n\n### 预告\n今天的内容也差不多了,下次会调整一下代码,毕竟也修改了很多次\n\n\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0705/20180710110213.png\",\"http://www.iamyann.com/images/0705/20180705153957.png\",\"http://www.iamyann.com/images/0705/20180705163954.png\",\"http://www.iamyann.com/images/0706/20180706182411.png\",\"http://www.iamyann.com/images/0706/20180706182717.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/03 12:32:39
parent authortmp4321
parent permlinkurl-yann-42
authora-0-0
permlinkre-tmp4321-url-yann-42-20180703t123235362z
title
body# # upvote for me please? https://steemit.com/news/@bible.com/2sysip #
json metadata{"tags":["devops"],"links":["https://steemit.com/news/@bible.com/2sysip"],"app":"steemit/0.1"}
Transaction InfoBlock #23852168/Trx 8249e2ffc4faf62a3a88b15c75e387073fae161b
View Raw JSON Data
{
  "trx_id": "8249e2ffc4faf62a3a88b15c75e387073fae161b",
  "block": 23852168,
  "trx_in_block": 40,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-03T12:32:39",
  "op": [
    "comment",
    {
      "parent_author": "tmp4321",
      "parent_permlink": "url-yann-42",
      "author": "a-0-0",
      "permlink": "re-tmp4321-url-yann-42-20180703t123235362z",
      "title": "",
      "body": "#\n# upvote for me please? https://steemit.com/news/@bible.com/2sysip\n#",
      "json_metadata": "{\"tags\":[\"devops\"],\"links\":[\"https://steemit.com/news/@bible.com/2sysip\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
alphabotupvoted (1.00%) @tmp4321 / url-yann-42
2018/07/03 12:32:00
voteralphabot
authortmp4321
permlinkurl-yann-42
weight100 (1.00%)
Transaction InfoBlock #23852156/Trx 6cd80b5592ec6716f0da6e0c2b5464c52ae92541
View Raw JSON Data
{
  "trx_id": "6cd80b5592ec6716f0da6e0c2b5464c52ae92541",
  "block": 23852156,
  "trx_in_block": 56,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-03T12:32:00",
  "op": [
    "vote",
    {
      "voter": "alphabot",
      "author": "tmp4321",
      "permlink": "url-yann-42",
      "weight": 100
    }
  ]
}
tmp4321published a new post: url-yann-42
2018/07/03 12:31:45
parent author
parent permlinkdevops
authortmp4321
permlinkurl-yann-42
title添加项目的URL - yann学长的运维开发指南42
body目前进度 第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度: 确保功能测试之间相互隔离 解决页面刷新延迟 使用TDD 实现新设计 逐步迭代,实现新设计 使用Django测试客户端一起测试视图、模板和URL 用于添加待办事项的URL和视图 调整模型 每个列表都应该有自己的URL 还需要一个视图,把待办事项加入现有清单 使用URL 引入做最后一次重构 http://www.iamyann.com/images/0703/20180703202305.png 内容介绍 新增项目需要URL 新建测试 添加路由 建立新的视图 修改视图 新增项目需要URL 需要准备一个URL给新增list时使用 新建测试 再新建一个测试类 vi lists / tests . py http://www.iamyann.com/images/0703/20180703194938.png 测试插入一个新项目,及302状态码 还有其他的写法,不过回头再说 添加路由 测试失败 python manage . py test lists AssertionError : 0 != 1 code was 404 ( expected 302 ) 缺少路由 vi superlists / urls . py http://www.iamyann.com/images/0703/20180703200306.png 建立新的视图 再次测试 python manage . py test lists no attribute 'new_list' 报没有视图 vi lists / views . py def new_list ( request ): pass 告警更新 python manage . py test lists The view lists . views . new_list didn ’ t return an HttpResponse object 修改视图 vi lists / views . py http://www.iamyann.com/images/0703/20180703200723.png 再次进行测试 python manage . py test lists self . assertEqual ( Item . objects . count (), 1 ) AssertionError : 0 != 1 把数据库中没有查到数据 补上提交语句 http://www.iamyann.com/images/0703/20180703200926.png 再次进行测试 python manage . py test lists Ran 7 tests in 0.030s OK 测试通过 预告 今天的内容也差不多了,新的测试类可以使用了,同时开发的语句也补充上去了 时间过的飞快,下节再见 http://hero.iamyann.com/blog_webchat.jpg
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0703/20180703202305.png","http://www.iamyann.com/images/0703/20180703194938.png","http://www.iamyann.com/images/0703/20180703200306.png","http://www.iamyann.com/images/0703/20180703200723.png","http://www.iamyann.com/images/0703/20180703200926.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23852152/Trx 41cf72a4877f6280543871835ca4e899cdcc647e
View Raw JSON Data
{
  "trx_id": "41cf72a4877f6280543871835ca4e899cdcc647e",
  "block": 23852152,
  "trx_in_block": 50,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-03T12:31:45",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "url-yann-42",
      "title": "添加项目的URL - yann学长的运维开发指南42",
      "body": "目前进度\n第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:\n\n确保功能测试之间相互隔离\n解决页面刷新延迟\n使用TDD 实现新设计\n逐步迭代,实现新设计\n使用Django测试客户端一起测试视图、模板和URL\n用于添加待办事项的URL和视图\n调整模型\n每个列表都应该有自己的URL\n还需要一个视图,把待办事项加入现有清单\n使用URL 引入做最后一次重构\n\nhttp://www.iamyann.com/images/0703/20180703202305.png\n\n内容介绍\n新增项目需要URL\n新建测试\n添加路由\n建立新的视图\n修改视图\n新增项目需要URL\n需要准备一个URL给新增list时使用\n\n新建测试\n再新建一个测试类\n\nvi lists\n/\ntests\n.\npy\nhttp://www.iamyann.com/images/0703/20180703194938.png\n\n测试插入一个新项目,及302状态码\n还有其他的写法,不过回头再说\n\n添加路由\n测试失败\n\npython manage\n.\npy test lists\nAssertionError\n:\n \n0\n \n!=\n \n1\ncode was \n404\n \n(\nexpected \n302\n)\n缺少路由\n\nvi superlists\n/\nurls\n.\npy\nhttp://www.iamyann.com/images/0703/20180703200306.png\n\n建立新的视图\n再次测试\n\npython manage\n.\npy test lists\nno attribute \n'new_list'\n报没有视图\n\nvi lists\n/\nviews\n.\npy\ndef\n new_list\n(\nrequest\n):\n    \npass\n告警更新\n\npython manage\n.\npy test lists\nThe\n view lists\n.\nviews\n.\nnew_list didn\n’\nt \nreturn\n an \nHttpResponse\n object\n修改视图\nvi lists\n/\nviews\n.\npy\nhttp://www.iamyann.com/images/0703/20180703200723.png\n再次进行测试\n\npython manage\n.\npy test lists\nself\n.\nassertEqual\n(\nItem\n.\nobjects\n.\ncount\n(),\n \n1\n)\nAssertionError\n:\n \n0\n \n!=\n \n1\n把数据库中没有查到数据\n\n补上提交语句\nhttp://www.iamyann.com/images/0703/20180703200926.png\n\n再次进行测试\n\npython manage\n.\npy test lists\nRan\n \n7\n tests \nin\n \n0.030s\nOK\n测试通过\n\n预告\n今天的内容也差不多了,新的测试类可以使用了,同时开发的语句也补充上去了\n\n时间过的飞快,下节再见\n\nhttp://hero.iamyann.com/blog_webchat.jpg",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0703/20180703202305.png\",\"http://www.iamyann.com/images/0703/20180703194938.png\",\"http://www.iamyann.com/images/0703/20180703200306.png\",\"http://www.iamyann.com/images/0703/20180703200723.png\",\"http://www.iamyann.com/images/0703/20180703200926.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: url-yann-41
2018/06/21 12:45:42
parent author
parent permlinkdevops
authortmp4321
permlinkurl-yann-41
title新的URL - yann学长的运维开发指南41
body### 大纲 第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站 加上域名就可以对外展示的那种 ![http://www.iamyann.com/images/0621/20180621204227.png](http://www.iamyann.com/images/0621/20180621204227.png) <!--more--> ### 内容介绍 > * 新的URL > * 新建清单测试 > * 添加模板 > * 建立新的模板 > * 修改模板和视图 ### 新的URL 在之前的测试中,发现需要额外的一个URL,不能用首页来展示查询内容 所以本章就造一个URL出来 #### 新建清单测试 再新建一个测试 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0621/20180621201550.png](http://www.iamyann.com/images/0621/20180621201550.png) #### 添加模板 测试失败 ```bash python manage.py test lists AssertionError: False is not true : Template 'list.html' was not a template used to render the response. Actual template(s) used: home.html ``` 缺少模板 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0621/20180621201855.png](http://www.iamyann.com/images/0621/20180621201855.png) #### 建立新的模板 再次测试 ```bash python manage.py test lists django.template.exceptions.TemplateDoesNotExist: list.html ``` 报没有模板 ```bash touch lists/templates/list.html python manage.py test lists AssertionError: False is not true : Couldn't find 'itemey 1' in response' ``` 告警有了变化 #### 修改模板和视图 复制home.html的内容,再做一些修改 ```bash cp lists/templates/home.html lists/templates/list.html vi lists/templates/home.html vi lists/views.py ``` ![http://www.iamyann.com/images/0621/20180621202957.png](http://www.iamyann.com/images/0621/20180621202957.png) ![http://www.iamyann.com/images/0621/20180621203035.png](http://www.iamyann.com/images/0621/20180621203035.png) 再次进行测试 ```bash python manage.py test lists AssertionError: '1: Buy milk' not found in ['1: Buy peacock feathers', '2: Buy milk'] ``` 新配置的URL起作用了,和首页区分开来 ### 预告 战线拖的太长,我也快归纳不出全局了,下节要更新下结构,突出大纲 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0621/20180621204227.png","http://www.iamyann.com/images/0621/20180621201550.png","http://www.iamyann.com/images/0621/20180621201855.png","http://www.iamyann.com/images/0621/20180621202957.png","http://www.iamyann.com/images/0621/20180621203035.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23516414/Trx 0ca8d530d69d78fc801d47751a980cfe4929d8d1
View Raw JSON Data
{
  "trx_id": "0ca8d530d69d78fc801d47751a980cfe4929d8d1",
  "block": 23516414,
  "trx_in_block": 40,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-06-21T12:45:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "url-yann-41",
      "title": "新的URL - yann学长的运维开发指南41",
      "body": "### 大纲\n第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站\n加上域名就可以对外展示的那种\n\n![http://www.iamyann.com/images/0621/20180621204227.png](http://www.iamyann.com/images/0621/20180621204227.png)\n<!--more-->\n\n### 内容介绍\n> * 新的URL\n> * 新建清单测试\n> * 添加模板\n> * 建立新的模板\n> * 修改模板和视图\n\n### 新的URL\n在之前的测试中,发现需要额外的一个URL,不能用首页来展示查询内容\n\n所以本章就造一个URL出来\n\n#### 新建清单测试\n再新建一个测试\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0621/20180621201550.png](http://www.iamyann.com/images/0621/20180621201550.png)\n\n#### 添加模板\n测试失败\n\n```bash\npython manage.py test lists\n\nAssertionError: False is not true : Template 'list.html' was not a template\nused to render the response. Actual template(s) used: home.html\n```\n缺少模板\n\n```bash\nvi lists/views.py\n```\n![http://www.iamyann.com/images/0621/20180621201855.png](http://www.iamyann.com/images/0621/20180621201855.png)\n\n#### 建立新的模板\n再次测试\n\n```bash\npython manage.py test lists\n\ndjango.template.exceptions.TemplateDoesNotExist: list.html\n```\n报没有模板\n\n```bash\ntouch lists/templates/list.html\npython manage.py test lists\n\nAssertionError: False is not true : Couldn't find 'itemey 1' in response'\n```\n告警有了变化\n\n#### 修改模板和视图\n复制home.html的内容,再做一些修改\n\n```bash\ncp lists/templates/home.html lists/templates/list.html\n\nvi lists/templates/home.html\nvi lists/views.py\n```\n\n![http://www.iamyann.com/images/0621/20180621202957.png](http://www.iamyann.com/images/0621/20180621202957.png)\n\n![http://www.iamyann.com/images/0621/20180621203035.png](http://www.iamyann.com/images/0621/20180621203035.png)\n\n再次进行测试\n```bash\npython manage.py test lists\n\nAssertionError: '1: Buy milk' not found in ['1: Buy peacock feathers', '2: Buy\nmilk']\n```\n新配置的URL起作用了,和首页区分开来\n\n### 预告\n战线拖的太长,我也快归纳不出全局了,下节要更新下结构,突出大纲\n\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0621/20180621204227.png\",\"http://www.iamyann.com/images/0621/20180621201550.png\",\"http://www.iamyann.com/images/0621/20180621201855.png\",\"http://www.iamyann.com/images/0621/20180621202957.png\",\"http://www.iamyann.com/images/0621/20180621203035.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-40
2018/06/19 09:59:24
parent author
parent permlinkdevops
authortmp4321
permlinkyann-40
title新的工具 - yann学长的运维开发指南40
body### 大纲 第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站 加上域名就可以对外展示的那种 ![http://www.iamyann.com/images/0619/20180619175618.png](http://www.iamyann.com/images/0619/20180619175618.png) <!--more--> ### 内容介绍 > * 新的工具 > * 新建测试类 > * 配置新的URL > * 建立新的视图 > * 再次更新 > * 测试通过? > * 重新审视代码 ### 新的工具 之前的测试代码比较繁琐,需要检查URL解析,检查视图函数及模板渲染 这里介绍一个新的工具,来替代上述三种检查,虽然新工具一定会有新的问题,先用起来 #### 新建测试类 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0619/20180619171859.png](http://www.iamyann.com/images/0619/20180619171859.png) #### 配置新的URL 测试新写的测试类 ```bash python manage.py test lists AssertionError: 404 != 200 ``` 设置的唯一URL还不存在,自己设定一下 ```bash vi superlists/urls.py ``` ![http://www.iamyann.com/images/0619/20180619172403.png](http://www.iamyann.com/images/0619/20180619172403.png) 增加一条路由匹配 #### 建立新的视图 再次测试 ```bash python manage.py test lists AttributeError: module 'lists.views' has no attribute 'view_list' ``` 建了匹配没有给对应的视图,自己设定一下 ```bash vi lists/views.py ``` ```Python def view_list(request): pass ``` 最简单的试图 #### 再次更新 再运行一下测试 ```bash python manage.py test lists It returned None instead. FAILED (errors=1) ``` 把视图函数补完,先借用home页面 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0619/20180619173659.png](http://www.iamyann.com/images/0619/20180619173659.png) #### 测试通过? 单元测试通过 ```bash python manage.py test lists Ran 7 tests in 0.016s OK ``` 再试一下功能测试 ```python python manage.py test functional_tests FAIL: test_can_start_a_list_for_one_user ``` 依然失败 #### 重新审视代码 暂时没有很好的办法,重看下之前的代码 然后发现了一个问题 ```bash vi lists/templates/home.html ``` ```html <!-- <form method="POST"> --> <form method="POST" action="/"> ``` 在表单里,action表示提交后的跳转动作,之前一直没有写,也就没跳转orz 再次测试一下 ```bash python manage.py test functional_tests FAIL: test_multiple_users_can_start_lists_at_different_urls ``` 回到了之前的状况,下次可以深入改造了 ### 预告 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0619/20180619175618.png","http://www.iamyann.com/images/0619/20180619171859.png","http://www.iamyann.com/images/0619/20180619172403.png","http://www.iamyann.com/images/0619/20180619173659.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23455529/Trx 4166b95c11eb73230ffcfa71aa234e92a10eeefb
View Raw JSON Data
{
  "trx_id": "4166b95c11eb73230ffcfa71aa234e92a10eeefb",
  "block": 23455529,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-06-19T09:59:24",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-40",
      "title": "新的工具 - yann学长的运维开发指南40",
      "body": "### 大纲\n第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站\n加上域名就可以对外展示的那种\n\n![http://www.iamyann.com/images/0619/20180619175618.png](http://www.iamyann.com/images/0619/20180619175618.png)\n<!--more-->\n\n### 内容介绍\n> * 新的工具\n> * 新建测试类\n> * 配置新的URL\n> * 建立新的视图\n> * 再次更新\n> * 测试通过?\n> * 重新审视代码\n\n### 新的工具\n之前的测试代码比较繁琐,需要检查URL解析,检查视图函数及模板渲染\n\n这里介绍一个新的工具,来替代上述三种检查,虽然新工具一定会有新的问题,先用起来\n\n#### 新建测试类\n```bash\nvi lists/tests.py\n```\n\n![http://www.iamyann.com/images/0619/20180619171859.png](http://www.iamyann.com/images/0619/20180619171859.png)\n\n#### 配置新的URL\n测试新写的测试类\n\n```bash\npython manage.py test lists\n\nAssertionError: 404 != 200\n```\n设置的唯一URL还不存在,自己设定一下\n\n```bash\nvi superlists/urls.py\n```\n\n![http://www.iamyann.com/images/0619/20180619172403.png](http://www.iamyann.com/images/0619/20180619172403.png)\n\n增加一条路由匹配\n\n#### 建立新的视图\n再次测试\n\n```bash\npython manage.py test lists\n\nAttributeError: module 'lists.views' has no attribute 'view_list'\n```\n建了匹配没有给对应的视图,自己设定一下\n\n```bash\nvi lists/views.py\n```\n```Python\ndef view_list(request):\n    pass\n```\n最简单的试图\n\n#### 再次更新\n再运行一下测试\n\n```bash\npython manage.py test lists\n\nIt returned None instead. FAILED (errors=1)\n```\n把视图函数补完,先借用home页面\n```bash\nvi lists/views.py\n```\n\n![http://www.iamyann.com/images/0619/20180619173659.png](http://www.iamyann.com/images/0619/20180619173659.png)\n\n#### 测试通过?\n单元测试通过\n```bash\npython manage.py test lists\n\nRan 7 tests in 0.016s\nOK\n```\n再试一下功能测试\n```python\npython manage.py test functional_tests\n\nFAIL: test_can_start_a_list_for_one_user\n```\n依然失败\n\n#### 重新审视代码\n暂时没有很好的办法,重看下之前的代码\n然后发现了一个问题\n\n```bash\nvi lists/templates/home.html\n```\n```html\n<!-- <form method=\"POST\"> -->\n<form method=\"POST\" action=\"/\">  \n```\n在表单里,action表示提交后的跳转动作,之前一直没有写,也就没跳转orz\n\n再次测试一下\n```bash\npython manage.py test functional_tests\n\nFAIL: test_multiple_users_can_start_lists_at_different_urls\n```\n回到了之前的状况,下次可以深入改造了\n### 预告\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0619/20180619175618.png\",\"http://www.iamyann.com/images/0619/20180619171859.png\",\"http://www.iamyann.com/images/0619/20180619172403.png\",\"http://www.iamyann.com/images/0619/20180619173659.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
hackerzizonupvoted (1.00%) @tmp4321 / yann-38
2018/06/14 12:59:15
voterhackerzizon
authortmp4321
permlinkyann-38
weight100 (1.00%)
Transaction InfoBlock #23315150/Trx 6d8de49d1915668d83a1c4438c9ff409b76532e7
View Raw JSON Data
{
  "trx_id": "6d8de49d1915668d83a1c4438c9ff409b76532e7",
  "block": 23315150,
  "trx_in_block": 46,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-06-14T12:59:15",
  "op": [
    "vote",
    {
      "voter": "hackerzizon",
      "author": "tmp4321",
      "permlink": "yann-38",
      "weight": 100
    }
  ]
}
tmp4321published a new post: yann-38
2018/06/14 12:58:45
parent author
parent permlinkdevops
authortmp4321
permlinkyann-38
title一点设计 - yann学长的运维开发指南38
body### 大纲 第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站 加上域名就可以对外展示的那种 ![http://www.iamyann.com/images/0614/20180614205540.png](http://www.iamyann.com/images/0614/20180614205540.png) <!--more--> ### 内容介绍 > * 下面来看今天的内容 > * 具体内容如下: > * 访问方法 > * 新建多用户测试 > * 补完测试脚本 > * 测试效果 > * 构造唯一URL测试 > * 尝试修改视图 ### 一点点设计 #### 访问方法 今天来说一点点设计,涉及备忘录的访问方式,新建条目和文件的方式 作为一个web应用,所谓的方法也是通过web实现的 /lists/id/ 表示清单各自独立的URL /lists/new 表示新建清单条目 /lists/id/add_item 在已有的清单上建立文章 #### 新建多用户测试 老规矩, 有新的需求先把相关的测试写出来 ```bash vi functional_tests/tests.py ``` ![http://www.iamyann.com/images/0614/20180614201357.png](http://www.iamyann.com/images/0614/20180614201357.png) 增加了一个多用户测试,使用了 self.assertRegex() 函数,回头再讲解 #### 补完测试脚本 继续补充其他测试语句 ![http://www.iamyann.com/images/0614/20180614202148.png](http://www.iamyann.com/images/0614/20180614202148.png) 内容如下: 新用户,确认没有之前提交的条目 Buy peacock feathers和make a fly 录入Buy milk 条目,获取唯一URL 再次确认没有之前提交的条目 #### 测试效果 运行一下功能测试,发现一个成功,一个失败 ```bash python manage.py test functional_tests .F '/lists/.+' not found in 'http://localhost:8081/' ``` 看来我们的测试方法还需要修正 #### 构造唯一URL测试 根据报错提示,没有唯一的URL 鉴于相关的代码还没写,我们可以想办法构造一个,先增加点测试 ```bash vi lists/tests.py ``` ```python self.assertEqual(response.status_code, 302) self.assertEqual(response['location'], '/lists/the-only-list-in-the-world/') ``` ```bash python manage.py test lists AssertionError: '/' != '/lists/the-only-list-in-the-world/' ``` 没有这个网址 这是我们最早设置的提示语句,说明功能测试已经跑到最后了,运行测试成功 #### 尝试修改视图 修改下视图文件,看能不能暂时构造出来 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0614/20180614204648.png](http://www.iamyann.com/images/0614/20180614204648.png) 再次测试一下 ```bash python manage.py test lists ``` ![http://www.iamyann.com/images/0614/20180614204855.png](http://www.iamyann.com/images/0614/20180614204855.png) 测试依然无法通过, 只有老老实实写语句了,下次会为其添加唯一URL ### 预告 时间过的飞快,下节再见 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0614/20180614205540.png","http://www.iamyann.com/images/0614/20180614201357.png","http://www.iamyann.com/images/0614/20180614202148.png","http://www.iamyann.com/images/0614/20180614204648.png","http://www.iamyann.com/images/0614/20180614204855.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23315140/Trx ab227997319cb11b276473ed588325e1edf3a647
View Raw JSON Data
{
  "trx_id": "ab227997319cb11b276473ed588325e1edf3a647",
  "block": 23315140,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-06-14T12:58:45",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-38",
      "title": "一点设计 - yann学长的运维开发指南38",
      "body": "### 大纲\n第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站\n加上域名就可以对外展示的那种\n![http://www.iamyann.com/images/0614/20180614205540.png](http://www.iamyann.com/images/0614/20180614205540.png)\n<!--more-->\n\n### 内容介绍\n\n\n> * 下面来看今天的内容\n> * 具体内容如下:\n> * 访问方法\n> * 新建多用户测试\n> * 补完测试脚本\n> * 测试效果\n> * 构造唯一URL测试\n> * 尝试修改视图\n\n### 一点点设计\n#### 访问方法\n今天来说一点点设计,涉及备忘录的访问方式,新建条目和文件的方式\n\n作为一个web应用,所谓的方法也是通过web实现的\n\n/lists/id/\n表示清单各自独立的URL\n\n/lists/new\n表示新建清单条目\n\n/lists/id/add_item\n在已有的清单上建立文章\n\n#### 新建多用户测试\n老规矩, 有新的需求先把相关的测试写出来\n\n```bash\nvi functional_tests/tests.py\n```\n![http://www.iamyann.com/images/0614/20180614201357.png](http://www.iamyann.com/images/0614/20180614201357.png)\n\n增加了一个多用户测试,使用了 self.assertRegex() 函数,回头再讲解\n\n#### 补完测试脚本\n继续补充其他测试语句\n![http://www.iamyann.com/images/0614/20180614202148.png](http://www.iamyann.com/images/0614/20180614202148.png)\n\n内容如下:\n新用户,确认没有之前提交的条目 Buy peacock feathers和make a fly\n\n录入Buy milk 条目,获取唯一URL\n\n再次确认没有之前提交的条目\n\n#### 测试效果\n运行一下功能测试,发现一个成功,一个失败\n\n```bash\npython manage.py test functional_tests\n.F\n'/lists/.+' not found in\n'http://localhost:8081/'\n```\n看来我们的测试方法还需要修正\n\n#### 构造唯一URL测试\n根据报错提示,没有唯一的URL\n\n鉴于相关的代码还没写,我们可以想办法构造一个,先增加点测试\n```bash\nvi lists/tests.py\n```\n```python\nself.assertEqual(response.status_code, 302)\nself.assertEqual(response['location'], '/lists/the-only-list-in-the-world/')\n```\n```bash\npython manage.py test lists\n\nAssertionError: '/' != '/lists/the-only-list-in-the-world/'\n```\n没有这个网址\n\n\n这是我们最早设置的提示语句,说明功能测试已经跑到最后了,运行测试成功\n\n#### 尝试修改视图\n修改下视图文件,看能不能暂时构造出来\n```bash\nvi lists/views.py\n```\n![http://www.iamyann.com/images/0614/20180614204648.png](http://www.iamyann.com/images/0614/20180614204648.png)\n\n再次测试一下\n```bash\npython manage.py test lists\n```\n![http://www.iamyann.com/images/0614/20180614204855.png](http://www.iamyann.com/images/0614/20180614204855.png)\n\n测试依然无法通过, 只有老老实实写语句了,下次会为其添加唯一URL\n\n### 预告\n时间过的飞快,下节再见\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0614/20180614205540.png\",\"http://www.iamyann.com/images/0614/20180614201357.png\",\"http://www.iamyann.com/images/0614/20180614202148.png\",\"http://www.iamyann.com/images/0614/20180614204648.png\",\"http://www.iamyann.com/images/0614/20180614204855.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-37
2018/06/05 13:22:27
parent author
parent permlinkdevops
authortmp4321
permlinkyann-37
title网页渲染时间 - yann学长的运维开发指南37
body### 大纲 第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站 加上域名就可以对外展示的那种 ![http://www.iamyann.com/images/0605/20180605211851.png](http://www.iamyann.com/images/0605/20180605211851.png) <!--more--> ### 内容介绍 今天说一下,修改代码以解决测试框架即时操作与网页渲染过慢的矛盾 下面来看今天的内容 具体内容如下: > * 整理模块 > * 文件目录结构 > * 添加NewVisitorTest类 > * 修改访问地址 > * 运行新的功能测试 ### 解决网页渲染时间 #### 只运行单元测试 现在运行测试命令,Django会运行功能测试和单元测试 ```bash python manage.py test ......F Ran 7 tests in 6.732s ``` 如果打算只运行单元测试,就要额外指出 ```bash python manage.py test lists Ran 6 tests in 0.009s ``` #### 升级Selenium 原书的作者在这里升级了Selenium和Geckodriver,因为他遇到了问题 但我并没有遇到,也可能是因为我没有使用Geckodriver. 总之贴一下方法. ```bash pip install --upgrade selenium # 下载新的Geckodriver https://github.com/mozilla/geckodriver/releases ``` #### 说一下 time.sleep 在之前的功能测试里,有这样一个语句 ![http://www.iamyann.com/images/0605/20180605204949.png](http://www.iamyann.com/images/0605/20180605204949.png) 这个语句的意思是发送完Enter后休眠1秒钟,让测试框架有时间检查table的内容 用这个的原因是,浏览器渲染需要时间 #### 反复测试页面 重构一下测试,在10秒内反复测试页面 ![http://www.iamyann.com/images/0605/20180605205641.png](http://www.iamyann.com/images/0605/20180605205641.png) ![http://www.iamyann.com/images/0605/20180605205945.png](http://www.iamyann.com/images/0605/20180605205945.png) 试了一下,方法可用,现在来改变测试方法 #### 运行新的测试 替换相关语句,具体对比如下 ![http://www.iamyann.com/images/0605/20180605210957.png](http://www.iamyann.com/images/0605/20180605210957.png) 更新后,测试通过 ```bash python manage.py test ......F ``` 这是我们最早设置的提示语句,说明功能测试已经跑到最后了,运行测试成功 ### 预告 今天和页面的渲染时间斗争了一晚上,新功能只能下会再说明了 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0605/20180605211851.png","http://www.iamyann.com/images/0605/20180605204949.png","http://www.iamyann.com/images/0605/20180605205641.png","http://www.iamyann.com/images/0605/20180605205945.png","http://www.iamyann.com/images/0605/20180605210957.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23057050/Trx 5f89336d56c95fbd19c0f1f249b96e7543e1d20e
View Raw JSON Data
{
  "trx_id": "5f89336d56c95fbd19c0f1f249b96e7543e1d20e",
  "block": 23057050,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-06-05T13:22:27",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-37",
      "title": "网页渲染时间 - yann学长的运维开发指南37",
      "body": "### 大纲\n第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站\n加上域名就可以对外展示的那种\n![http://www.iamyann.com/images/0605/20180605211851.png](http://www.iamyann.com/images/0605/20180605211851.png)\n<!--more-->\n\n### 内容介绍\n今天说一下,修改代码以解决测试框架即时操作与网页渲染过慢的矛盾\n\n下面来看今天的内容\n具体内容如下:\n> * 整理模块\n> * 文件目录结构\n> * 添加NewVisitorTest类\n> * 修改访问地址\n> * 运行新的功能测试\n\n### 解决网页渲染时间\n#### 只运行单元测试\n现在运行测试命令,Django会运行功能测试和单元测试\n```bash\npython manage.py test\n\n......F\nRan 7 tests in 6.732s\n```\n如果打算只运行单元测试,就要额外指出\n```bash\npython manage.py test lists\n\nRan 6 tests in 0.009s\n```\n#### 升级Selenium\n原书的作者在这里升级了Selenium和Geckodriver,因为他遇到了问题\n\n但我并没有遇到,也可能是因为我没有使用Geckodriver. 总之贴一下方法.\n\n```bash\npip install --upgrade selenium\n# 下载新的Geckodriver\nhttps://github.com/mozilla/geckodriver/releases\n```\n\n#### 说一下 time.sleep\n在之前的功能测试里,有这样一个语句\n\n![http://www.iamyann.com/images/0605/20180605204949.png](http://www.iamyann.com/images/0605/20180605204949.png)\n这个语句的意思是发送完Enter后休眠1秒钟,让测试框架有时间检查table的内容\n\n用这个的原因是,浏览器渲染需要时间\n\n#### 反复测试页面\n重构一下测试,在10秒内反复测试页面\n![http://www.iamyann.com/images/0605/20180605205641.png](http://www.iamyann.com/images/0605/20180605205641.png)\n![http://www.iamyann.com/images/0605/20180605205945.png](http://www.iamyann.com/images/0605/20180605205945.png)\n试了一下,方法可用,现在来改变测试方法\n\n#### 运行新的测试\n替换相关语句,具体对比如下\n![http://www.iamyann.com/images/0605/20180605210957.png](http://www.iamyann.com/images/0605/20180605210957.png)\n更新后,测试通过\n```bash\npython manage.py test\n......F\n```\n\n这是我们最早设置的提示语句,说明功能测试已经跑到最后了,运行测试成功\n\n\n### 预告\n今天和页面的渲染时间斗争了一晚上,新功能只能下会再说明了\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0605/20180605211851.png\",\"http://www.iamyann.com/images/0605/20180605204949.png\",\"http://www.iamyann.com/images/0605/20180605205641.png\",\"http://www.iamyann.com/images/0605/20180605205945.png\",\"http://www.iamyann.com/images/0605/20180605210957.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-34
2018/05/31 14:06:54
parent author
parent permlinkdevops
authortmp4321
permlinkyann-34
title新的一章 - yann学长的运维开发指南34
body### 大纲 第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站 加上域名就可以对外展示的那种 ![http://www.iamyann.com/images/0531/20180531202651.png](http://www.iamyann.com/images/0531/20180531202651.png) <!--more--> ### 内容介绍 根据大纲看来,这一章也是内容复杂的一章,不过请放心,最后会有总结的 下面来看今天的内容: 具体内容如下: > * 整理模块 > * 文件目录结构 > * 添加NewVisitorTest类 > * 修改访问地址 > * 运行新的功能测试 ### 功能测试的隔离 #### 整理模块 上一章最后遗留了一个问题: 多执行几次功能测试后,页面上会留下复数的内容结果,虽然手动解决了,但不是最佳方法 其实,单元测试是会自己建数据库内容,用完自己清除的,但功能测用的是真实库不能这样 不过Django有一个类可以做这个工作 LiveServerTestCase 先整理一下测试模块 ```bash mkdir functional_tests touch functional_tests/__init__.py git mv functional_tests.py functional_tests/tests.py ``` 为功能测试专门建了一个目录 __init__.py是模块必须的 使用git mv移动了功能测试文件 #### 文件目录结构 调整后的文件目录结构如下: ![http://www.iamyann.com/images/0531/20180531204147.png](http://www.iamyann.com/images/0531/20180531204147.png) 各部分之前章节都有过说明,如果有疑问请留言咨询 #### 添加NewVisitorTest类 经过前几的几章,功能测试文件已经很大了,我们只能展示开头部分 ```bash vi functional_tests/tests.py ``` ![http://www.iamyann.com/images/0531/20180531204858.png](http://www.iamyann.com/images/0531/20180531204858.png) 添加 class NewVisitorTest() #### 修改访问地址 引入新类的同时,也不能使用原有的localhost方式访问了 ```bash vi functional_tests/tests.py ``` ![http://www.iamyann.com/images/0531/20180531205513.png](http://www.iamyann.com/images/0531/20180531205513.png) 双#的注释是我加的,可以看到get地址已经变掉了 #### 运行新的功能测试 使用新的命令来运动功能测试 ```bash python manage.py test functional_tests self.fail('Finish the test!') AssertionError: Finish the test! ``` 这是我们最早设置的提示语句,说明功能测试已经跑到最后了,运行测试成功 ### 预告 新的一章开始了,希望大家和我一同加油! ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0531/20180531202651.png","http://www.iamyann.com/images/0531/20180531204147.png","http://www.iamyann.com/images/0531/20180531204858.png","http://www.iamyann.com/images/0531/20180531205513.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22914001/Trx a289f0724b401069cf81716d7e7cbb90e0092c16
View Raw JSON Data
{
  "trx_id": "a289f0724b401069cf81716d7e7cbb90e0092c16",
  "block": 22914001,
  "trx_in_block": 74,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-31T14:06:54",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-34",
      "title": "新的一章 - yann学长的运维开发指南34",
      "body": "### 大纲\n第6章的内容还是比较激动的,在这个章节里会完成一个可用的网站\n加上域名就可以对外展示的那种\n![http://www.iamyann.com/images/0531/20180531202651.png](http://www.iamyann.com/images/0531/20180531202651.png)\n<!--more-->\n\n### 内容介绍\n\n根据大纲看来,这一章也是内容复杂的一章,不过请放心,最后会有总结的\n\n下面来看今天的内容:\n具体内容如下:\n> * 整理模块\n> * 文件目录结构\n> * 添加NewVisitorTest类\n> * 修改访问地址\n> * 运行新的功能测试\n\n### 功能测试的隔离\n#### 整理模块\n上一章最后遗留了一个问题:\n\n多执行几次功能测试后,页面上会留下复数的内容结果,虽然手动解决了,但不是最佳方法\n\n其实,单元测试是会自己建数据库内容,用完自己清除的,但功能测用的是真实库不能这样\n\n不过Django有一个类可以做这个工作 LiveServerTestCase\n\n先整理一下测试模块\n```bash\nmkdir functional_tests\ntouch functional_tests/__init__.py\n\ngit mv functional_tests.py functional_tests/tests.py\n```\n为功能测试专门建了一个目录\n__init__.py是模块必须的\n使用git mv移动了功能测试文件\n\n#### 文件目录结构\n调整后的文件目录结构如下:\n\n![http://www.iamyann.com/images/0531/20180531204147.png](http://www.iamyann.com/images/0531/20180531204147.png)\n\n各部分之前章节都有过说明,如果有疑问请留言咨询\n\n#### 添加NewVisitorTest类\n经过前几的几章,功能测试文件已经很大了,我们只能展示开头部分\n\n```bash\nvi functional_tests/tests.py\n```\n![http://www.iamyann.com/images/0531/20180531204858.png](http://www.iamyann.com/images/0531/20180531204858.png)\n添加 class NewVisitorTest()\n\n#### 修改访问地址\n引入新类的同时,也不能使用原有的localhost方式访问了\n```bash\nvi functional_tests/tests.py\n```\n![http://www.iamyann.com/images/0531/20180531205513.png](http://www.iamyann.com/images/0531/20180531205513.png)\n双#的注释是我加的,可以看到get地址已经变掉了\n\n#### 运行新的功能测试\n使用新的命令来运动功能测试\n```bash\npython manage.py test functional_tests\n\nself.fail('Finish the test!')\nAssertionError: Finish the test!\n```\n\n这是我们最早设置的提示语句,说明功能测试已经跑到最后了,运行测试成功\n\n\n### 预告\n新的一章开始了,希望大家和我一同加油!\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0531/20180531202651.png\",\"http://www.iamyann.com/images/0531/20180531204147.png\",\"http://www.iamyann.com/images/0531/20180531204858.png\",\"http://www.iamyann.com/images/0531/20180531205513.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
chenlocusupvoted (100.00%) @tmp4321 / 5-yann-33
2018/05/29 06:40:33
voterchenlocus
authortmp4321
permlink5-yann-33
weight10000 (100.00%)
Transaction InfoBlock #22847479/Trx 4a846c9687ccb27464c15c7babceb5a96fe9cdc7
View Raw JSON Data
{
  "trx_id": "4a846c9687ccb27464c15c7babceb5a96fe9cdc7",
  "block": 22847479,
  "trx_in_block": 28,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-29T06:40:33",
  "op": [
    "vote",
    {
      "voter": "chenlocus",
      "author": "tmp4321",
      "permlink": "5-yann-33",
      "weight": 10000
    }
  ]
}
tmp4321published a new post: 5-yann-33
2018/05/29 06:19:48
parent author
parent permlinkdevops
authortmp4321
permlink5-yann-33
title内容总结5 - yann学长的运维开发指南33
body### 大纲 第五次内容终结的大纲 本次的主要内容是把用户输入的内容保存到数据库中 ![http://www.iamyann.com/images/0529/20180529134917.png](http://www.iamyann.com/images/0529/20180529134917.png) <!--more--> ### 分集介绍 以下为前面数期的分集介绍,提供超链接指向,方便查看. 具体内容如下: > * 编写表单,发送POST请求 > * 在服务器中处理POST请求 > * 把Python变量传入模板中渲染 > * ORM及数据库模型 > * 把POST请求中的数据存入数据库 > * 处理完POST请求后重定向 > * 在模板中渲染待办事项 > * 使用迁移创建生产数据库 ### 分集大纲 #### 编写表单,发送POST请求 ![http://www.iamyann.com/images/0529/20180529140043.png](http://www.iamyann.com/images/0529/20180529140043.png) #### 在服务器中处理POST请求 ![http://www.iamyann.com/images/0529/20180529140119.png](http://www.iamyann.com/images/0529/20180529140119.png) #### 把Python变量传入模板中渲染 ![http://www.iamyann.com/images/0529/20180529140145.png](http://www.iamyann.com/images/0529/20180529140145.png) #### ORM及数据库模型 ![http://www.iamyann.com/images/0529/20180529140212.png](http://www.iamyann.com/images/0529/20180529140212.png) #### 把POST请求中的数据存入数据库 ![http://www.iamyann.com/images/0529/20180529140241.png](http://www.iamyann.com/images/0529/20180529140241.png) #### 处理完POST请求后重定向 ![http://www.iamyann.com/images/0529/20180529140306.png](http://www.iamyann.com/images/0529/20180529140306.png) #### 在模板中渲染待办事项 ![http://www.iamyann.com/images/0529/20180529140328.png](http://www.iamyann.com/images/0529/20180529140328.png) #### 使用迁移创建生产数据库 ![http://www.iamyann.com/images/0529/20180529140348.png](http://www.iamyann.com/images/0529/20180529140348.png) ### 预告 对前面的8篇文章做了一个汇总, 本来是应该周末做的,但是远程不太方便又摸鱼了 好吧,只是一个借口,周末光顾着听歌了,没去弄,顺便推荐一下我用的sonos极好用 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0529/20180529134917.png","http://www.iamyann.com/images/0529/20180529140043.png","http://www.iamyann.com/images/0529/20180529140119.png","http://www.iamyann.com/images/0529/20180529140145.png","http://www.iamyann.com/images/0529/20180529140212.png","http://www.iamyann.com/images/0529/20180529140241.png","http://www.iamyann.com/images/0529/20180529140306.png","http://www.iamyann.com/images/0529/20180529140328.png","http://www.iamyann.com/images/0529/20180529140348.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22847064/Trx 109f29981efb9a8d9416cc09f880e2495d81e831
View Raw JSON Data
{
  "trx_id": "109f29981efb9a8d9416cc09f880e2495d81e831",
  "block": 22847064,
  "trx_in_block": 24,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-29T06:19:48",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "5-yann-33",
      "title": "内容总结5 - yann学长的运维开发指南33",
      "body": "### 大纲\n第五次内容终结的大纲\n本次的主要内容是把用户输入的内容保存到数据库中\n![http://www.iamyann.com/images/0529/20180529134917.png](http://www.iamyann.com/images/0529/20180529134917.png)\n<!--more-->\n\n### 分集介绍\n\n以下为前面数期的分集介绍,提供超链接指向,方便查看.\n\n具体内容如下:\n> * 编写表单,发送POST请求\n> * 在服务器中处理POST请求\n> * 把Python变量传入模板中渲染\n> * ORM及数据库模型\n> * 把POST请求中的数据存入数据库\n> * 处理完POST请求后重定向\n> * 在模板中渲染待办事项\n> * 使用迁移创建生产数据库\n\n\n\n\n### 分集大纲\n#### 编写表单,发送POST请求\n![http://www.iamyann.com/images/0529/20180529140043.png](http://www.iamyann.com/images/0529/20180529140043.png)\n\n#### 在服务器中处理POST请求\n![http://www.iamyann.com/images/0529/20180529140119.png](http://www.iamyann.com/images/0529/20180529140119.png)\n\n#### 把Python变量传入模板中渲染\n![http://www.iamyann.com/images/0529/20180529140145.png](http://www.iamyann.com/images/0529/20180529140145.png)\n\n#### ORM及数据库模型\n![http://www.iamyann.com/images/0529/20180529140212.png](http://www.iamyann.com/images/0529/20180529140212.png)\n\n#### 把POST请求中的数据存入数据库\n![http://www.iamyann.com/images/0529/20180529140241.png](http://www.iamyann.com/images/0529/20180529140241.png)\n\n#### 处理完POST请求后重定向\n![http://www.iamyann.com/images/0529/20180529140306.png](http://www.iamyann.com/images/0529/20180529140306.png)\n\n#### 在模板中渲染待办事项\n![http://www.iamyann.com/images/0529/20180529140328.png](http://www.iamyann.com/images/0529/20180529140328.png)\n\n#### 使用迁移创建生产数据库\n![http://www.iamyann.com/images/0529/20180529140348.png](http://www.iamyann.com/images/0529/20180529140348.png)\n\n### 预告\n对前面的8篇文章做了一个汇总, 本来是应该周末做的,但是远程不太方便又摸鱼了\n\n好吧,只是一个借口,周末光顾着听歌了,没去弄,顺便推荐一下我用的sonos极好用\n\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0529/20180529134917.png\",\"http://www.iamyann.com/images/0529/20180529140043.png\",\"http://www.iamyann.com/images/0529/20180529140119.png\",\"http://www.iamyann.com/images/0529/20180529140145.png\",\"http://www.iamyann.com/images/0529/20180529140212.png\",\"http://www.iamyann.com/images/0529/20180529140241.png\",\"http://www.iamyann.com/images/0529/20180529140306.png\",\"http://www.iamyann.com/images/0529/20180529140328.png\",\"http://www.iamyann.com/images/0529/20180529140348.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-33
2018/05/24 13:48:18
parent author
parent permlinkdevops
authortmp4321
permlinkyann-33
title迁移数据库 - yann学长的运维开发指南33
body--- title: 迁移数据库 - yann学长的运维开发指南33 tags: - python categories: - 运维开发 keywords: 'python,tdd,web开发' description: 操作数据库 date: 2018-05-24 21:21:09 --- ### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/0524/20180524214623.png](http://www.iamyann.com/images/0524/20180524214623.png) <!--more--> ### 介绍 上节说到修改模板以显示多条记录,但并没有说完,现在补充余下的部分. 今天的具体内容如下: > * 代办事项传入模板 > * 看不懂错误时换个方式 > * 数据库位置 > * 数据库迁移 > * 修改模板中的序号表示 > * 一点点小问题 #### 代办事项传入模板 修改视图文件,传值到模板 ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0524/20180524212629.png](http://www.iamyann.com/images/0524/20180524212629.png) 再次运行测试 ```bash python functional_tests.py AssertionError: 'To-Do' not found in 'OperationalError at /' ``` #### 看不懂错误时换个方式 在浏览器下打开页面 http://localhost:8000 ```bash no such table: lists_item ``` 渲染完毕的浏览器报出了故障的原因: 找不到lists_item表 需要做数据库迁移了 #### 数据库位置 数据库迁移只是一个说法,其实是用之前写好的建表文件在固定的地方来建立数据库 建库的位置是写在配置文件里的,默认在项目的基础目录 ```bash vi superlists/settings.py ``` ![http://www.iamyann.com/images/0524/20180524213414.png](http://www.iamyann.com/images/0524/20180524213414.png) #### 数据库迁移 在项目的基础目录运行数据库迁移命令,其实大多数命令都是在这个目录下运行的 ```bash python manage.py migrate ``` 刷新刚才打开的浏览器 ```bash AssertionError: '2: Use peacock feathers to make a fly' not found in ['1: Buy peacock feathers', '1: Use peacock feathers to make a fly'] ``` 序号还是不对 #### 修改模板中的序号表示 forloop.counter标签 ```bash vi lists/templates/home.html ``` ![http://www.iamyann.com/images/0524/20180524214002.png](http://www.iamyann.com/images/0524/20180524214002.png) 再次运行,测试成功 #### 一点点小问题 再次确认测试成功.结果发现每测一次,页面会多两条相同的数据 对于这个问题,目前先手动处理下 ```bash rm db.sqlite3 python manage.py migrate --noinput ``` ### 预告 漫长的第五章终于完成了,周末我打算做一个大纲并附上链接,希望自己不要摸鱼^^ ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0524/20180524214623.png","http://www.iamyann.com/images/0524/20180524212629.png","http://www.iamyann.com/images/0524/20180524213414.png","http://www.iamyann.com/images/0524/20180524214002.png","http://hero.iamyann.com/blog_webchat.jpg"],"links":["http://localhost:8000"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22712060/Trx db8f039f1bdd22ee01348c5f0c06f6ccb20cbf77
View Raw JSON Data
{
  "trx_id": "db8f039f1bdd22ee01348c5f0c06f6ccb20cbf77",
  "block": 22712060,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-24T13:48:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-33",
      "title": "迁移数据库 - yann学长的运维开发指南33",
      "body": "---\ntitle: 迁移数据库 - yann学长的运维开发指南33\ntags:\n  - python\ncategories:\n  - 运维开发\nkeywords: 'python,tdd,web开发'\ndescription: 操作数据库\ndate: 2018-05-24 21:21:09\n---\n\n\n### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/0524/20180524214623.png](http://www.iamyann.com/images/0524/20180524214623.png)\n<!--more-->\n\n### 介绍\n\n上节说到修改模板以显示多条记录,但并没有说完,现在补充余下的部分.\n\n今天的具体内容如下:\n> * 代办事项传入模板\n> * 看不懂错误时换个方式\n> * 数据库位置\n> * 数据库迁移\n> * 修改模板中的序号表示\n> * 一点点小问题\n\n\n\n\n#### 代办事项传入模板\n修改视图文件,传值到模板\n```bash\nvi lists/views.py\n```\n![http://www.iamyann.com/images/0524/20180524212629.png](http://www.iamyann.com/images/0524/20180524212629.png)\n\n再次运行测试\n```bash\npython functional_tests.py\n\nAssertionError: 'To-Do' not found in 'OperationalError at /'\n```\n#### 看不懂错误时换个方式\n在浏览器下打开页面 http://localhost:8000\n\n\n```bash\nno such table: lists_item\n```\n渲染完毕的浏览器报出了故障的原因:\n找不到lists_item表\n需要做数据库迁移了\n\n#### 数据库位置\n数据库迁移只是一个说法,其实是用之前写好的建表文件在固定的地方来建立数据库\n\n建库的位置是写在配置文件里的,默认在项目的基础目录\n```bash\nvi superlists/settings.py\n```\n![http://www.iamyann.com/images/0524/20180524213414.png](http://www.iamyann.com/images/0524/20180524213414.png)\n\n\n\n#### 数据库迁移\n在项目的基础目录运行数据库迁移命令,其实大多数命令都是在这个目录下运行的\n```bash\npython manage.py migrate\n```\n刷新刚才打开的浏览器\n```bash\nAssertionError: '2: Use peacock feathers to make a fly' not found in ['1: Buy\npeacock feathers', '1: Use peacock feathers to make a fly']\n```\n序号还是不对\n\n#### 修改模板中的序号表示\nforloop.counter标签\n```bash\nvi lists/templates/home.html\n```\n![http://www.iamyann.com/images/0524/20180524214002.png](http://www.iamyann.com/images/0524/20180524214002.png)\n\n再次运行,测试成功\n\n#### 一点点小问题\n再次确认测试成功.结果发现每测一次,页面会多两条相同的数据\n\n对于这个问题,目前先手动处理下\n```bash\nrm db.sqlite3\npython manage.py migrate --noinput\n```\n\n\n### 预告\n漫长的第五章终于完成了,周末我打算做一个大纲并附上链接,希望自己不要摸鱼^^\n\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0524/20180524214623.png\",\"http://www.iamyann.com/images/0524/20180524212629.png\",\"http://www.iamyann.com/images/0524/20180524213414.png\",\"http://www.iamyann.com/images/0524/20180524214002.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"links\":[\"http://localhost:8000\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: post-yann-32
2018/05/22 10:22:36
parent author
parent permlinkdevops
authortmp4321
permlinkpost-yann-32
title处理完POST请求后跳转 - yann学长的运维开发指南32
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/0522/20180522181936.png](http://www.iamyann.com/images/0522/20180522181936.png) <!--more--> ### 介绍 上节介绍了如何测试数据库里数据的条数及如何识别空的提交内容. 提示一下,目前的环境里每次测试是现插数据到数据库的,用完就清理掉了,请注意 今天的具体内容如下: > * POST请求后需要重定向 > * 清理视图函数 > * 分割测试内容 > * 在模板中渲染多条记录 > * 模板遍历列表 #### POST请求后需要重定向 处理完POST请求后是需要重定向的,先试一下重定向到首页,修改测试文件 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0522/20180522171835.png](http://www.iamyann.com/images/0522/20180522171835.png) 测试断言状态码302和路径'/' #### 清理视图函数 运行测试报错,200 != 302 目标达到,调整视图 ```bash lists/views.py ``` ![http://www.iamyann.com/images/0522/20180522172233.png](http://www.iamyann.com/images/0522/20180522172233.png) 新增了重定向部分,测试通过 #### 分割测试内容 习惯上,一段测试代码只测一个内容,这样可以避免前面断言的失败影响后面的测试 修改下现有的测试 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0522/20180522173040.png](http://www.iamyann.com/images/0522/20180522173040.png) #### 在模板中渲染多条记录 这个是之前的需求之一,不能总显示一条记录 继续新建测试 ```bash lists/tests.py ``` ![http://www.iamyann.com/images/0517/20180522173742.png](http://www.iamyann.com/images/0517/20180522173742.png) 内容很简单,插入两条记录,期望显示2条 #### 模板遍历列表 意料之内的失败 ```bash AssertionError: 'itemey 1' not found in '<html>\n <head>\n [...]' ``` 更新home模板 ```bash lists/templates/home.html ``` ![http://www.iamyann.com/images/0522/20180522181431.png](http://www.iamyann.com/images/0522/20180522181431.png) 只更新模板,还不足以让测试通过,所以这里只是熟悉一下 %for in%的语法 下一节会解决剩下的问题,同时迁移创建数据库 ### 预告 写了30篇小短文后,回头看看自己的公众号,感觉不是很连续 后续要整理下,每完成一个大的章节,就做一个大纲并附上链接,方便读者阅读 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0522/20180522181936.png","http://www.iamyann.com/images/0522/20180522171835.png","http://www.iamyann.com/images/0522/20180522172233.png","http://www.iamyann.com/images/0522/20180522173040.png","http://www.iamyann.com/images/0517/20180522173742.png","http://www.iamyann.com/images/0522/20180522181431.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22650726/Trx 8d1d927d4e35a1fb8066077b1b2b5e268b723b94
View Raw JSON Data
{
  "trx_id": "8d1d927d4e35a1fb8066077b1b2b5e268b723b94",
  "block": 22650726,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-22T10:22:36",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "post-yann-32",
      "title": "处理完POST请求后跳转 - yann学长的运维开发指南32",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/0522/20180522181936.png](http://www.iamyann.com/images/0522/20180522181936.png)\n<!--more-->\n\n### 介绍\n\n上节介绍了如何测试数据库里数据的条数及如何识别空的提交内容.\n提示一下,目前的环境里每次测试是现插数据到数据库的,用完就清理掉了,请注意\n\n今天的具体内容如下:\n> * POST请求后需要重定向\n> * 清理视图函数\n> * 分割测试内容\n> * 在模板中渲染多条记录\n> * 模板遍历列表\n\n\n\n#### POST请求后需要重定向\n处理完POST请求后是需要重定向的,先试一下重定向到首页,修改测试文件\n```bash\nvi lists/tests.py\n```\n![http://www.iamyann.com/images/0522/20180522171835.png](http://www.iamyann.com/images/0522/20180522171835.png)\n\n测试断言状态码302和路径'/'\n\n#### 清理视图函数\n运行测试报错,200 != 302\n\n目标达到,调整视图\n\n```bash\nlists/views.py\n```\n![http://www.iamyann.com/images/0522/20180522172233.png](http://www.iamyann.com/images/0522/20180522172233.png)\n\n新增了重定向部分,测试通过\n\n#### 分割测试内容\n习惯上,一段测试代码只测一个内容,这样可以避免前面断言的失败影响后面的测试\n修改下现有的测试\n\n```bash\nvi lists/tests.py\n```\n![http://www.iamyann.com/images/0522/20180522173040.png](http://www.iamyann.com/images/0522/20180522173040.png)\n\n\n#### 在模板中渲染多条记录\n这个是之前的需求之一,不能总显示一条记录\n继续新建测试\n```bash\nlists/tests.py\n```\n![http://www.iamyann.com/images/0517/20180522173742.png](http://www.iamyann.com/images/0517/20180522173742.png)\n内容很简单,插入两条记录,期望显示2条\n\n#### 模板遍历列表\n意料之内的失败\n```bash\nAssertionError: 'itemey 1' not found in '<html>\\n    <head>\\n [...]'\n```\n\n更新home模板\n\n```bash\nlists/templates/home.html\n```\n![http://www.iamyann.com/images/0522/20180522181431.png](http://www.iamyann.com/images/0522/20180522181431.png)\n\n只更新模板,还不足以让测试通过,所以这里只是熟悉一下 %for in%的语法\n\n下一节会解决剩下的问题,同时迁移创建数据库\n\n\n### 预告\n写了30篇小短文后,回头看看自己的公众号,感觉不是很连续\n后续要整理下,每完成一个大的章节,就做一个大纲并附上链接,方便读者阅读\n\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0522/20180522181936.png\",\"http://www.iamyann.com/images/0522/20180522171835.png\",\"http://www.iamyann.com/images/0522/20180522172233.png\",\"http://www.iamyann.com/images/0522/20180522173040.png\",\"http://www.iamyann.com/images/0517/20180522173742.png\",\"http://www.iamyann.com/images/0522/20180522181431.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
steemdelegated 18.114 SP to @tmp4321
2018/05/19 10:26:57
delegatorsteem
delegateetmp4321
vesting shares29496.448096 VESTS
Transaction InfoBlock #22564428/Trx f97d5ae88296840a417b7a70d0bc360d6e5d34b7
View Raw JSON Data
{
  "trx_id": "f97d5ae88296840a417b7a70d0bc360d6e5d34b7",
  "block": 22564428,
  "trx_in_block": 63,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-19T10:26:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "tmp4321",
      "vesting_shares": "29496.448096 VESTS"
    }
  ]
}
tmp4321published a new post: post-yann-31
2018/05/17 14:08:15
parent author
parent permlinkdevops
authortmp4321
permlinkpost-yann-31
titlePOST请求参数存入数据库 - yann学长的运维开发指南31
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/0517/20180517220201.png](http://www.iamyann.com/images/0517/20180517220201.png) <!--more--> ### 介绍 在上节的内容中,填写的内容是无法保持的,所以本节会介绍ORM,使用其比直接操作数据库方便一点. 今天的具体内容如下: > * 把POST请求的参数存入数据库 > * 提交到数据库 > * 修改函数返回值 > * 不保存空内容的测试 > * 更新视图 #### 把POST请求的参数存入数据库 更新上周的测试模块,添加三条语句 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0517/20180517210947.png](http://www.iamyann.com/images/0517/20180517210947.png) objects.count()是objects.all().count()的简写 对比数据库记录总笔数是不是等于1条 objects.first()第一条记录的对象 再对比对象的text内容是否等于给定值 测试文件也比较长了,回头需要重写一下 #### 提交到数据库 运行测试报错,数据库笔数为0 ```bash self.assertEqual(Item.objects.count(), 1) AssertionError: 0 != 1 ``` 调整视图 ```bash lists/views.py ``` ![http://www.iamyann.com/images/0517/20180517212032.png](http://www.iamyann.com/images/0517/20180517212032.png) 写了个不是很完善的home_page函数,通过了测试, 回头需要更新一下 #### 修改函数返回值 通过了单元测试,把返回修改下 ```python vi lists/views.py return render(request, 'home.html', { 'new_item_text': item.text }) ``` 不用获取了,直接使用对象 #### 不保存空内容的测试 下面开如新的测试,这次的测试起源于一个需求:无内容的提交不要保存 再建一个测试方法 ```bash lists/tests.py ``` ![http://www.iamyann.com/images/0517/20180517213236.png](http://www.iamyann.com/images/0517/20180517213236.png) 检测没有提交时,数据库笔数是否为0 #### 更新视图 测试报错 1 != 0 failure ```bash vi lists/views.py ``` ![http://www.iamyann.com/images/0517/20180517214943.png](http://www.iamyann.com/images/0517/20180517214943.png) 调整视图文件,测试通过 建了一个新变量,其值是POST请求数据或空字符串 .objects.create是创建新Item对象的简化方式,不需要调用保存方法 ### 预告 写了30篇小短文后,回头看看自己的公众号,感觉不是很连续 后续要整理下,每完成一个大的章节,就做一个大纲并附上链接,方便读者阅读 ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0517/20180517220201.png","http://www.iamyann.com/images/0517/20180517210947.png","http://www.iamyann.com/images/0517/20180517212032.png","http://www.iamyann.com/images/0517/20180517213236.png","http://www.iamyann.com/images/0517/20180517214943.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22511262/Trx 73b5b72c6caa85dee110586175ac457c9d57062b
View Raw JSON Data
{
  "trx_id": "73b5b72c6caa85dee110586175ac457c9d57062b",
  "block": 22511262,
  "trx_in_block": 83,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-17T14:08:15",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "post-yann-31",
      "title": "POST请求参数存入数据库 - yann学长的运维开发指南31",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/0517/20180517220201.png](http://www.iamyann.com/images/0517/20180517220201.png)\n<!--more-->\n\n### 介绍\n\n在上节的内容中,填写的内容是无法保持的,所以本节会介绍ORM,使用其比直接操作数据库方便一点.\n\n今天的具体内容如下:\n> * 把POST请求的参数存入数据库\n> * 提交到数据库\n> * 修改函数返回值\n> * 不保存空内容的测试\n> * 更新视图\n\n\n\n#### 把POST请求的参数存入数据库\n更新上周的测试模块,添加三条语句\n```bash\nvi lists/tests.py\n```\n![http://www.iamyann.com/images/0517/20180517210947.png](http://www.iamyann.com/images/0517/20180517210947.png)\n\nobjects.count()是objects.all().count()的简写\n对比数据库记录总笔数是不是等于1条\n\nobjects.first()第一条记录的对象\n再对比对象的text内容是否等于给定值\n\n测试文件也比较长了,回头需要重写一下\n\n#### 提交到数据库\n运行测试报错,数据库笔数为0\n```bash\nself.assertEqual(Item.objects.count(), 1)\nAssertionError: 0 != 1\n```\n调整视图\n\n```bash\nlists/views.py\n```\n![http://www.iamyann.com/images/0517/20180517212032.png](http://www.iamyann.com/images/0517/20180517212032.png)\n\n写了个不是很完善的home_page函数,通过了测试, 回头需要更新一下\n\n#### 修改函数返回值\n通过了单元测试,把返回修改下\n```python\nvi lists/views.py\n    return render(request, 'home.html', {\n        'new_item_text': item.text\n    })\n```\n不用获取了,直接使用对象\n\n#### 不保存空内容的测试\n下面开如新的测试,这次的测试起源于一个需求:无内容的提交不要保存\n\n再建一个测试方法\n\n```bash\nlists/tests.py\n```\n![http://www.iamyann.com/images/0517/20180517213236.png](http://www.iamyann.com/images/0517/20180517213236.png)\n检测没有提交时,数据库笔数是否为0\n\n#### 更新视图\n测试报错 1 != 0 failure\n\n```bash\nvi lists/views.py\n```\n![http://www.iamyann.com/images/0517/20180517214943.png](http://www.iamyann.com/images/0517/20180517214943.png)\n调整视图文件,测试通过\n\n建了一个新变量,其值是POST请求数据或空字符串\n\n.objects.create是创建新Item对象的简化方式,不需要调用保存方法\n\n\n\n### 预告\n写了30篇小短文后,回头看看自己的公众号,感觉不是很连续 \n后续要整理下,每完成一个大的章节,就做一个大纲并附上链接,方便读者阅读\n\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0517/20180517220201.png\",\"http://www.iamyann.com/images/0517/20180517210947.png\",\"http://www.iamyann.com/images/0517/20180517212032.png\",\"http://www.iamyann.com/images/0517/20180517213236.png\",\"http://www.iamyann.com/images/0517/20180517214943.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: orm-yann-30
2018/05/15 15:33:45
parent author
parent permlinkdevops
authortmp4321
permlinkorm-yann-30
titleORM及数据库模型 - yann学长的运维开发指南30
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/0515/20180515174205.png](http://www.iamyann.com/images/0515/20180515174205.png) <!--more--> ### 介绍 在上节的内容中,填写的内容是无法保持的,所以本节会介绍ORM,使用其比直接操作数据库方便一点. 今天的具体内容如下: > * 给ORM的测试 > * 定义Item > * 继承save属性 > * 构造lists_item表 > * 定义text属性 > * 生成数据库字段 > * 定义默认值 #### 给ORM的测试 先写一个测试类,给ORM用 ```bash vi lists/tests.py ``` ![http://www.iamyann.com/images/0515/20180515174605.png](http://www.iamyann.com/images/0515/20180515174605.png) 内容为保存两个item到数据库,再查询数据库中的所有,看是不是有两个 最后调出两个数据看和测试期望值是否匹配 #### 定义Item 运行测试,报无法导入Item模块 ```bash ImportError: cannot import name 'Item' ``` 去models.py里建立Item类 ```Python vi lists/models.py from django.db import models class Item(object): pass ``` #### 继承save属性 再测试发现没有save属性 ```bash first_item.save() AttributeError: 'Item' object has no attribute 'save' ``` 去models.py里建立Item类 ```python vi lists/models.py from django.db import models class Item(models.Model): pass ``` 从Model类继承相关属性 #### 构造lists_item表 再次测试,报没有表 lists_item ```bash django.db.utils.OperationalError: no such table: lists_item ``` 开始建造结构 ```bash python manage.py makemigrations # 查看生成的文件 ls lists/migrations 0001_initial.py __init__.py __pycache__ ``` #### 定义text属性 再次测试,报没有text属性 ```bash AttributeError: 'Item' object has no attribute 'text' ``` 于是写入text的定义 ```python vi lists/models.py class Item(models.Model): text = models.TextField() ``` #### 生成数据库字段 再次测试,报没有lists_item.text行 ```bash django.db.utils.OperationalError: no such column: lists_item.text ``` 这是因为之前都是对数据库的设计,其实还没有定入数据库 ```bash python manage.py makemigrations ``` 这时运行数据库,会有提示没有默认值,这时选择2退出去字段的默认值 #### 定义默认值 ```python vi lists/models.py class Item(models.Model): text = models.TextField(default='') ``` 再次迁移并运行测试,测试成功 ```bash python manage.py makemigrations python manage.py test lists ``` ### 预告 今天的内容,繁杂且乱,基于正式的开发,是不用这个样子操作的,但对于学习,这样的流程是很好的 通过一步步说明了,操作ORM的需求,每个语句为什么要写 基于长度考虑,我会尽量减少代码的演示,控制表达. 力求说明白,简短表达. 现在还在过渡期,请大家逐渐习惯一下,因为我自己也觉得,手机上看自己写的东西没那么舒服.所以开始改变. ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0515/20180515174205.png","http://www.iamyann.com/images/0515/20180515174605.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22455383/Trx 38820cd4cbd200e6803bc462dfa23f8084197710
View Raw JSON Data
{
  "trx_id": "38820cd4cbd200e6803bc462dfa23f8084197710",
  "block": 22455383,
  "trx_in_block": 55,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-15T15:33:45",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "orm-yann-30",
      "title": "ORM及数据库模型 - yann学长的运维开发指南30",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/0515/20180515174205.png](http://www.iamyann.com/images/0515/20180515174205.png)\n<!--more-->\n\n### 介绍\n\n在上节的内容中,填写的内容是无法保持的,所以本节会介绍ORM,使用其比直接操作数据库方便一点.\n\n今天的具体内容如下:\n> * 给ORM的测试\n> * 定义Item\n> * 继承save属性\n> * 构造lists_item表\n> * 定义text属性\n> * 生成数据库字段\n> * 定义默认值\n\n\n\n#### 给ORM的测试\n先写一个测试类,给ORM用\n```bash\nvi lists/tests.py\n```\n![http://www.iamyann.com/images/0515/20180515174605.png](http://www.iamyann.com/images/0515/20180515174605.png)\n\n内容为保存两个item到数据库,再查询数据库中的所有,看是不是有两个\n最后调出两个数据看和测试期望值是否匹配\n\n#### 定义Item\n运行测试,报无法导入Item模块\n```bash\nImportError: cannot import name 'Item'\n```\n去models.py里建立Item类\n\n```Python\nvi lists/models.py\n\nfrom django.db import models\n\nclass Item(object):\n    pass\n```\n\n#### 继承save属性\n再测试发现没有save属性\n```bash\nfirst_item.save()\nAttributeError: 'Item' object has no attribute 'save'\n```\n去models.py里建立Item类\n\n```python\nvi lists/models.py\n\nfrom django.db import models\n\nclass Item(models.Model):\n    pass\n```\n从Model类继承相关属性\n\n#### 构造lists_item表\n再次测试,报没有表 lists_item\n\n```bash\ndjango.db.utils.OperationalError: no such table: lists_item\n```\n开始建造结构\n```bash\npython manage.py makemigrations\n# 查看生成的文件\nls lists/migrations\n0001_initial.py  __init__.py  __pycache__\n```\n\n#### 定义text属性\n再次测试,报没有text属性\n\n```bash\nAttributeError: 'Item' object has no attribute 'text'\n```\n于是写入text的定义\n\n```python\nvi lists/models.py\n\nclass Item(models.Model):\n    text = models.TextField()\n```\n\n#### 生成数据库字段\n再次测试,报没有lists_item.text行\n\n```bash\ndjango.db.utils.OperationalError: no such column: lists_item.text\n```\n这是因为之前都是对数据库的设计,其实还没有定入数据库\n\n```bash\npython manage.py makemigrations\n```\n这时运行数据库,会有提示没有默认值,这时选择2退出去字段的默认值\n\n#### 定义默认值\n```python\nvi lists/models.py\n\nclass Item(models.Model):\n    text = models.TextField(default='')\n```\n再次迁移并运行测试,测试成功\n\n```bash\npython manage.py makemigrations\npython manage.py test lists\n```\n\n### 预告\n今天的内容,繁杂且乱,基于正式的开发,是不用这个样子操作的,但对于学习,这样的流程是很好的\n\n通过一步步说明了,操作ORM的需求,每个语句为什么要写\n\n基于长度考虑,我会尽量减少代码的演示,控制表达. 力求说明白,简短表达.\n\n现在还在过渡期,请大家逐渐习惯一下,因为我自己也觉得,手机上看自己写的东西没那么舒服.所以开始改变.\n\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0515/20180515174205.png\",\"http://www.iamyann.com/images/0515/20180515174605.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-29
2018/05/10 16:27:33
parent author
parent permlinkdevops
authortmp4321
permlinkyann-29
title关于表单提交的功能测试 - yann学长的运维开发指南29
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/20180508163521.png](http://www.iamyann.com/images/20180508163521.png) <!--more--> ### 介绍 今天的内容是服务端处理POST请求及模板渲染. 今天的具体内容如下: > * 再次发起功能测试 > * 构造新的功能测试 ### 再次发起功能测试 上节通过各种修改,我们POST的字符串,传到了模板上,并通过了相关的单元测试. 这次我们要对其再进行功能测试 ```bash python functional_tests.py ``` 结果测试失败,表格上并没有字符串 ```bash AssertionError: False is not true : New to-do item did not appear in table ``` 为了让报错再明显一点,我们修改了functional_tests.py 测试文件 [点击查看 functional_tests.py](https://github.com/lluxury/python-tdd-book/commit/4985c90533b73befa4d40d2832ebd2dd2ceb0773) 以显示特定文字及table.text的变量 其中这个f是python3.6才有的用法, 格式化的字符串常量,后面会找个机会说明一下 ```bash python functional_tests.py ``` 再次测试,打印出的变量和测试设置的变量不同 ```bash AssertionError: False is not true : New to-do item did not appear in table. Contents were: Buy peacock feathers ``` 修改lists/templates/home.html 模板文件解决,修改之后测试通过 [点击查看 lists/templates/home.html](https://github.com/lluxury/python-tdd-book/commit/e0b3a4a5c0092c3a026dce025a010f48308a1cf9) ### 构造新的功能测试 因为之前的功能测试, 我们是修改了测试文件才通过的,所以很怀疑其功能性 把'1:'排在外面通过了,那再新添加一个项目,'1:'变成'2:'的时候,能通过么 说干就干,下面构建新的测试 [点击查看 functional_tests.py](https://github.com/lluxury/python-tdd-book/commit/e0b3a4a5c0092c3a026dce025a010f48308a1cf9) 果然失败了 ```bash AssertionError: '1: Buy peacock feathers' not found in ['1: Use peacock feathers to make a fly'] ``` 期待的'2:'项目没有出来,还是会去找第'1:'项 其实我们感觉到缺什么东西, 但现在条件还不具备,只能用妥协的办法实现需求 比如说,再改一次测试 [点击查看 functional_tests.py](https://github.com/lluxury/python-tdd-book/commit/39ad0257329bf51ce15807acdb765e7174827811) 手工写了第二条项目,测试又通过了,但我们都觉得,这样可不行. 先暂停一下,提交并上传代码, 下一节会介绍一个超好用的工具,解决目前的问题. 本节因为时间的问题, 先再见 ### 预告 首先设置了折线的长度,但是不知道适合手机的阅读在电脑上是效果. 但是我会尽量融合两种阅读习惯, 在手机上的碎片化阅读思路分享, 以及在电脑上的代码回顾. 基于长度考虑,我会尽量减少代码的演示,控制表达. 力求说明白,简短表达. 现在还在过渡期,请大家逐渐习惯一下,因为我自己也觉得,手机上看自己写的东西没那么舒服.所以开始改变. ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/20180508163521.png","http://hero.iamyann.com/blog_webchat.jpg"],"links":["https://github.com/lluxury/python-tdd-book/commit/4985c90533b73befa4d40d2832ebd2dd2ceb0773","https://github.com/lluxury/python-tdd-book/commit/e0b3a4a5c0092c3a026dce025a010f48308a1cf9","https://github.com/lluxury/python-tdd-book/commit/39ad0257329bf51ce15807acdb765e7174827811"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22312466/Trx e7563a9d1355e010e24268a58a0b6662cd7b233c
View Raw JSON Data
{
  "trx_id": "e7563a9d1355e010e24268a58a0b6662cd7b233c",
  "block": 22312466,
  "trx_in_block": 37,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-10T16:27:33",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-29",
      "title": "关于表单提交的功能测试 - yann学长的运维开发指南29",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/20180508163521.png](http://www.iamyann.com/images/20180508163521.png)\n<!--more-->\n\n### 介绍\n\n今天的内容是服务端处理POST请求及模板渲染.\n\n今天的具体内容如下:\n> * 再次发起功能测试\n> * 构造新的功能测试\n\n\n### 再次发起功能测试\n上节通过各种修改,我们POST的字符串,传到了模板上,并通过了相关的单元测试.\n\n这次我们要对其再进行功能测试\n\n```bash\npython functional_tests.py\n```\n结果测试失败,表格上并没有字符串\n```bash\nAssertionError: False is not true : New to-do item did not appear in table\n```\n\n为了让报错再明显一点,我们修改了functional_tests.py 测试文件\n\n[点击查看 functional_tests.py](https://github.com/lluxury/python-tdd-book/commit/4985c90533b73befa4d40d2832ebd2dd2ceb0773)\n\n以显示特定文字及table.text的变量\n\n其中这个f是python3.6才有的用法, 格式化的字符串常量,后面会找个机会说明一下\n\n```bash\npython functional_tests.py\n```\n再次测试,打印出的变量和测试设置的变量不同\n\n```bash\nAssertionError: False is not true : New to-do item did not appear in table.\nContents were:\nBuy peacock feathers\n```\n\n修改lists/templates/home.html 模板文件解决,修改之后测试通过\n\n[点击查看 lists/templates/home.html](https://github.com/lluxury/python-tdd-book/commit/e0b3a4a5c0092c3a026dce025a010f48308a1cf9)\n\n### 构造新的功能测试\n因为之前的功能测试, 我们是修改了测试文件才通过的,所以很怀疑其功能性\n\n把'1:'排在外面通过了,那再新添加一个项目,'1:'变成'2:'的时候,能通过么\n\n说干就干,下面构建新的测试\n[点击查看 functional_tests.py](https://github.com/lluxury/python-tdd-book/commit/e0b3a4a5c0092c3a026dce025a010f48308a1cf9)\n\n果然失败了\n\n```bash\nAssertionError: '1: Buy peacock feathers' not found in ['1: Use peacock\nfeathers to make a fly']\n```\n\n期待的'2:'项目没有出来,还是会去找第'1:'项\n\n其实我们感觉到缺什么东西, 但现在条件还不具备,只能用妥协的办法实现需求\n\n比如说,再改一次测试\n[点击查看 functional_tests.py](https://github.com/lluxury/python-tdd-book/commit/39ad0257329bf51ce15807acdb765e7174827811)\n\n手工写了第二条项目,测试又通过了,但我们都觉得,这样可不行.\n\n先暂停一下,提交并上传代码, 下一节会介绍一个超好用的工具,解决目前的问题. 本节因为时间的问题, 先再见 \n\n\n\n### 预告\n首先设置了折线的长度,但是不知道适合手机的阅读在电脑上是效果.\n\n但是我会尽量融合两种阅读习惯, 在手机上的碎片化阅读思路分享, 以及在电脑上的代码回顾.\n\n基于长度考虑,我会尽量减少代码的演示,控制表达. 力求说明白,简短表达.\n\n现在还在过渡期,请大家逐渐习惯一下,因为我自己也觉得,手机上看自己写的东西没那么舒服.所以开始改变.\n\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/20180508163521.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"links\":[\"https://github.com/lluxury/python-tdd-book/commit/4985c90533b73befa4d40d2832ebd2dd2ceb0773\",\"https://github.com/lluxury/python-tdd-book/commit/e0b3a4a5c0092c3a026dce025a010f48308a1cf9\",\"https://github.com/lluxury/python-tdd-book/commit/39ad0257329bf51ce15807acdb765e7174827811\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-28
2018/05/08 08:42:27
parent author
parent permlinkdevops
authortmp4321
permlinkyann-28
title服务端处理表单提交 - yann学长的运维开发指南28
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/20180508163521.png](http://www.iamyann.com/images/20180508163521.png) <!--more--> ### 介绍 今天的内容是服务端处理POST请求及模板渲染. 今天的具体内容如下: > * 服务端处理提交的请求 > * 构造正确的结果 > * 把变量传入模板渲染 > * 测试使用模板 > * 更新视图模块 ### 服务端处理提交的请求 复习一下之前的知识, form表单提交之后,会有一个action属性 如果没有指定属性的话,提交后会返回之前的页面,这样往往是有问题的 解决这个问题之前,先把测试文件写出来 ```bash vi lists/tests.py ``` ```python def test_uses_home_template(self): response = self.client.get('/') self.assertTemplateUsed(response, 'home.html') def test_can_save_a_POST_request(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertIn('A new list item', response.content.decode()) ``` 在HomePageTest类新加一个方法,检查POST后返回的是否html文件中是否有目标字段 ```bash python manage.py test AssertionError: 'A new list item' not found in '<html>\n <head>\n' ``` 提示没有找到提交的字段,显示的内容是首页的, 首页只有To-Do字样,测试看起来是正确的 ### 构造正确的结果 暂时修改下视图模块,给一个期待的反馈 ```bash vi lists/views.py ``` ```python from django.http import HttpResponse from django.shortcuts import render def home_page(request): if request.method == 'POST': return HttpResponse(request.POST['item_text']) return render(request, 'home.html') ``` 如果遇到POST的方法,直接把提交的字符串返回回去 这样测试是通过了,但也就没有测试应有的用途了 ### 把变量传入模板渲染 ```bash lists/templates/home.html ``` ```html <body> <h1>Your To-Do list</h1> <form method="POST"> <input name="item_text" id="id_new_item" placeholder="Enter a to-do item" /> {% csrf_token %} </form> <table id="id_list_table"> <tr><td>{{ new_item_text }}</td></tr> </table> </body> ``` 在模板上写一个表格,来放传过来的字符串 ### 测试使用模板 ```bash lists/tests.py ``` ```python def test_can_save_a_POST_request(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertIn('A new list item', response.content.decode()) self.assertTemplateUsed(response, 'home.html') ``` 增加模板测试内容,然后测试 ```bash python manage.py test AssertionError: No templates used to render the response ``` 因为视图函数没有使用模板,所以测试失败,这样就排除了之前"作弊"的内容 ### 更新视图模块 ```bash lists/views.py ``` ```python def home_page(request): return render(request, 'home.html', { 'new_item_text': request.POST['item_text'], }) ``` 更新试图内容,然后测试 ```bash python manage.py test ERROR: test_uses_home_template (lists.tests.HomePageTest) [...] File "...python-tdd-book/lists/views.py", line 5, in home_page 'new_item_text': request.POST['item_text'], [...] django.utils.datastructures.MultiValueDictKeyError: "'item_text'" ``` 意外故障出现,这是request.Post/Get 时,提取的 Key 不存在导致 ```bash lists/views.py ``` ```python def home_page(request): return render(request, 'home.html', { 'new_item_text': request.POST.get('item_text', ''), }) ``` 更新,修改了获取的方法 ### 预告 折腾了这么就,单元测试终于通过了,下一节会和功能测试做斗争 回顾一下,这已经是第28篇文章了, 坚持了几个月,但是最近越来越没动力,偶然间读了下自己的文章,感觉代入感不强,也许,代码还是应该回归电脑之前,在手机端解释代码的做法还是有些愚笨,还有3期,我也在孕量修改,到30期应该会有一个大的变化. ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/20180508163521.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22245578/Trx eabbfd471cc9564288272afe658057e96c0d09ce
View Raw JSON Data
{
  "trx_id": "eabbfd471cc9564288272afe658057e96c0d09ce",
  "block": 22245578,
  "trx_in_block": 37,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-08T08:42:27",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-28",
      "title": "服务端处理表单提交 - yann学长的运维开发指南28",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/20180508163521.png](http://www.iamyann.com/images/20180508163521.png)\n<!--more-->\n\n### 介绍\n\n今天的内容是服务端处理POST请求及模板渲染.\n\n今天的具体内容如下:\n> * 服务端处理提交的请求\n> * 构造正确的结果\n> * 把变量传入模板渲染\n> * 测试使用模板\n> * 更新视图模块\n\n\n### 服务端处理提交的请求\n复习一下之前的知识, form表单提交之后,会有一个action属性\n如果没有指定属性的话,提交后会返回之前的页面,这样往往是有问题的\n解决这个问题之前,先把测试文件写出来\n```bash\nvi  lists/tests.py\n```\n\n```python\ndef test_uses_home_template(self):\n    response = self.client.get('/')\n    self.assertTemplateUsed(response, 'home.html')\n\n\ndef test_can_save_a_POST_request(self):\n    response = self.client.post('/', data={'item_text': 'A new list item'})\n    self.assertIn('A new list item', response.content.decode())\n```\n在HomePageTest类新加一个方法,检查POST后返回的是否html文件中是否有目标字段\n```bash\npython manage.py test\nAssertionError: 'A new list item' not found in '<html>\\n    <head>\\n'\n```\n提示没有找到提交的字段,显示的内容是首页的, 首页只有To-Do字样,测试看起来是正确的\n\n### 构造正确的结果\n暂时修改下视图模块,给一个期待的反馈\n```bash\nvi lists/views.py\n```\n```python\nfrom django.http import HttpResponse\nfrom django.shortcuts import render\n\ndef home_page(request):\n    if request.method == 'POST':\n        return HttpResponse(request.POST['item_text'])\n    return render(request, 'home.html')\n```\n如果遇到POST的方法,直接把提交的字符串返回回去\n这样测试是通过了,但也就没有测试应有的用途了\n\n### 把变量传入模板渲染\n```bash\nlists/templates/home.html\n```\n```html\n<body>\n    <h1>Your To-Do list</h1>\n    <form method=\"POST\">\n        <input name=\"item_text\" id=\"id_new_item\" placeholder=\"Enter a to-do item\" />\n        {% csrf_token %}\n    </form>\n\n    <table id=\"id_list_table\">\n        <tr><td>{{ new_item_text }}</td></tr>  \n    </table>\n</body>\n```\n在模板上写一个表格,来放传过来的字符串\n\n### 测试使用模板\n\n```bash\nlists/tests.py\n```\n```python\ndef test_can_save_a_POST_request(self):\n    response = self.client.post('/', data={'item_text': 'A new list item'})\n    self.assertIn('A new list item', response.content.decode())\n    self.assertTemplateUsed(response, 'home.html')\n```\n增加模板测试内容,然后测试\n```bash\npython manage.py test\nAssertionError: No templates used to render the response\n```\n因为视图函数没有使用模板,所以测试失败,这样就排除了之前\"作弊\"的内容\n\n### 更新视图模块\n\n```bash\nlists/views.py\n```\n```python\ndef home_page(request):\n    return render(request, 'home.html', {\n        'new_item_text': request.POST['item_text'],\n    })\n```\n更新试图内容,然后测试\n```bash\npython manage.py test\n\nERROR: test_uses_home_template (lists.tests.HomePageTest)\n[...]\n  File \"...python-tdd-book/lists/views.py\", line 5, in home_page\n    'new_item_text': request.POST['item_text'],\n[...]\ndjango.utils.datastructures.MultiValueDictKeyError: \"'item_text'\"\n\n```\n意外故障出现,这是request.Post/Get 时,提取的 Key 不存在导致\n\n```bash\nlists/views.py\n```\n```python\ndef home_page(request):\n    return render(request, 'home.html', {\n        'new_item_text': request.POST.get('item_text', ''),\n    })\n```    \n更新,修改了获取的方法\n\n\n### 预告\n折腾了这么就,单元测试终于通过了,下一节会和功能测试做斗争\n\n回顾一下,这已经是第28篇文章了, 坚持了几个月,但是最近越来越没动力,偶然间读了下自己的文章,感觉代入感不强,也许,代码还是应该回归电脑之前,在手机端解释代码的做法还是有些愚笨,还有3期,我也在孕量修改,到30期应该会有一个大的变化.\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/20180508163521.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
tmp4321published a new post: yann-27
2018/05/03 09:38:03
parent author
parent permlinkdevops
authortmp4321
permlinkyann-27
title编写表单发送请求 - yann学长的运维开发指南27
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/0426/20180426144747.png](http://www.iamyann.com/images/0426/20180426144747.png) <!--more--> ### 介绍 延续上节的内容,这次来实践一下.主要内容是修改模板,及解决跨站问题. 今天的具体内容如下: > * 更新模板 > * 奇怪的失败 > * 稍微作弊一下 > * 问题解决 ### 更新模板 ```bash vi lists/templates/home.html ``` ```html <h1>Your To-Do list</h1> <form method="POST"> <input name="item_text" id="id_new_item" placeholder="Enter a to-do item" /> </form> <table id="id_list_table"> ``` ```bash python functional_tests.py ``` 为表单添加POST方法并测试 ### 奇怪的失败 测试失败,报错如下 ```bash [...] Traceback (most recent call last): File "functional_tests.py", line 40, in test_can_start_a_list_and_retrieve_it_later table = self.browser.find_element_by_id('id_list_table') [...] selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="id_list_table"] ``` 这个比较麻烦,没有明显的调试信息,说找不到的元素,其实也是有的 ### 稍微作弊一下 ```python vi functional_tests.py inputbox.send_keys(Keys.ENTER) time.sleep(10) table = self.browser.find_element_by_id('id_list_table') ``` 给操作的加一个休眠时间,在这个时间窗里,使用浏览器查看网页 ### 问题解决 作弊还是有效的,页面显示大大的403,并且说明有CSRF验证失败,跨域了呢 说明放在后面,先写下修正代码 ```bash vi lists/templates/home.html ``` ```html <form method="POST"> <input name="item_text" id="id_new_item" placeholder="Enter a to-do item" /> {% csrf_token %} </form> ``` ```bash python functional_tests.py ``` 报错消失 ### 预告 今天的内容其实不完整,可以等下一篇一起看.本来打算一起做出来的,但是因为篇幅原因放弃了. 上次是一小步,这次也是一小步,但是走一步算一步,只要坚持不倒退,总会到达目标的. ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0426/20180426144747.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #22102743/Trx 731395cc5d8ff09309a639750b22d948fae574bc
View Raw JSON Data
{
  "trx_id": "731395cc5d8ff09309a639750b22d948fae574bc",
  "block": 22102743,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-03T09:38:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-27",
      "title": "编写表单发送请求 - yann学长的运维开发指南27",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/0426/20180426144747.png](http://www.iamyann.com/images/0426/20180426144747.png)\n<!--more-->\n\n### 介绍\n\n延续上节的内容,这次来实践一下.主要内容是修改模板,及解决跨站问题.\n\n今天的具体内容如下:\n> * 更新模板\n> * 奇怪的失败\n> * 稍微作弊一下\n> * 问题解决\n\n\n### 更新模板\n```bash\nvi  lists/templates/home.html\n```\n\n```html\n  <h1>Your To-Do list</h1>\n  <form method=\"POST\">\n      <input name=\"item_text\" id=\"id_new_item\" placeholder=\"Enter a to-do item\" />\n  </form>\n\n  <table id=\"id_list_table\">\n```\n\n```bash\npython functional_tests.py\n```\n为表单添加POST方法并测试\n\n### 奇怪的失败\n测试失败,报错如下\n```bash\n[...]\nTraceback (most recent call last):\n  File \"functional_tests.py\", line 40, in\ntest_can_start_a_list_and_retrieve_it_later\n    table = self.browser.find_element_by_id('id_list_table')\n[...]\nselenium.common.exceptions.NoSuchElementException: Message: Unable to locate\nelement: [id=\"id_list_table\"]\n```\n这个比较麻烦,没有明显的调试信息,说找不到的元素,其实也是有的\n\n### 稍微作弊一下\n```python\nvi functional_tests.py\n    inputbox.send_keys(Keys.ENTER)\n    time.sleep(10)\n\n    table = self.browser.find_element_by_id('id_list_table')\n```\n给操作的加一个休眠时间,在这个时间窗里,使用浏览器查看网页\n\n### 问题解决\n作弊还是有效的,页面显示大大的403,并且说明有CSRF验证失败,跨域了呢\n说明放在后面,先写下修正代码\n```bash\nvi  lists/templates/home.html\n```\n\n```html\n<form method=\"POST\">\n    <input name=\"item_text\" id=\"id_new_item\" placeholder=\"Enter a to-do item\" />\n    {% csrf_token %}\n</form>\n```\n\n```bash\npython functional_tests.py\n```\n报错消失\n\n### 预告\n今天的内容其实不完整,可以等下一篇一起看.本来打算一起做出来的,但是因为篇幅原因放弃了.\n\n上次是一小步,这次也是一小步,但是走一步算一步,只要坚持不倒退,总会到达目标的.\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0426/20180426144747.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
anomalyupvoted (1.00%) @tmp4321 / yann-26
2018/04/26 13:28:21
voteranomaly
authortmp4321
permlinkyann-26
weight100 (1.00%)
Transaction InfoBlock #21905796/Trx 595606b4774cc1f0ace8a01e9ad54fd2c1fd0552
View Raw JSON Data
{
  "trx_id": "595606b4774cc1f0ace8a01e9ad54fd2c1fd0552",
  "block": 21905796,
  "trx_in_block": 88,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-26T13:28:21",
  "op": [
    "vote",
    {
      "voter": "anomaly",
      "author": "tmp4321",
      "permlink": "yann-26",
      "weight": 100
    }
  ]
}
tmp4321published a new post: yann-26
2018/04/26 12:56:21
parent author
parent permlinkdevops
authortmp4321
permlinkyann-26
titleyann学长的运维开发指南26
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/0419/lists.png](http://www.iamyann.com/images/0419/lists.png) <!--more--> ### 介绍 单元测试小有成就,这次来做一下功能测试 今天的具体内容如下: > * 表单及请求 > * 关于表单的及简说明 > * POST请求和GET ### 表单及请求 下面进入list项目的第5个小节,保存用户的输入内容,这节可是很长的,请大家做好准备. 先从上次分享的大图上撕下一小块内容来,如图: ![http://www.iamyann.com/images/0426/20180426144747.png](http://www.iamyann.com/images/0426/20180426144747.png) * 编写表单,发送POST请求 >提交表单 >面对面调试 >开放访问权限 >CSRF错误 >模板标签 本来打算一气说下去的. 如何提交表单,再调试,开放django的访问权限,果断的遇到跨域错误,再解决掉,再把提交的内容通过特殊标签打入模板. 不过为了我们可爱的雏鸟,我先把两块基础知识相关的内容说明一下吧. ### 关于表单的及简说明 表单是啥,我也说不清楚. 自我的理解就是一种网页组件,可以用来提交一些信息.比如我们最熟悉的登录页面. 另外,表单元素是可以操作的,之前流行的自动登录脚本,就是对表单元素操作的结果. 以下例子引自我最喜欢的w3school网站,如果人家来抗议的话,我会换成别家的. ```html <!DOCTYPE html> <html> <body> <form action="/demo/demo_form.asp"> First name:<br> <input type="text" name="firstname" value="Mickey"> <br> Last name:<br> <input type="text" name="lastname" value=" "> <br><br> <input type="submit" value="Submit"> </form> <p>如果您点击提交,表单数据会被发送到名为 demo_form.asp 的页面。</p> </body> </html> ``` 演示效果如图: ![http://www.iamyann.com/images/0426/20180424153117.png](http://www.iamyann.com/images/0426/20180424153117.png) 从界面看,比较重要的有输入框,提交按钮等 从代码看,还需要注意 action, 指出向何处发送表单数据 ### POST请求和GET 说完表单,我们还要说一下POST和GET,这东西嘛,我尽力说明,大家有个映象就行,实在理解不了,回头边敲代码边实践就好了. > * HTTP协议 HTTP使用统一资源标识符(URI)来传输数据和建立连接. URL: 就是网址, 包括协议,域名,端口,虚拟目录,文件名,锚及参数 > * URI和URL区别 网上的文档,图像,视频,花鸟鱼虫都有URI,URL是一种特殊的URI > * HTTP状态码 常见的500,404等,是服务端对客户端的响应 > * GET 和POST请求 GET和POST都是客户端向服务端请求方法,请求一定的Web页面的程序或用于特定的URL. 两者的主要差别是GET要提交数据的话,数据是放在URL里面的,非常不安全. 比如密码会被看到. POST方法提交的数据是放在HTTP包的Body中,会好很多. ps. 以上的说明非常的不完整,仅供科普,有意深究的同学请自己查询相关资料. ### 预告 今天没有代码,全是基础说明,请期待下一篇. 上次是一小步,这次也是一小步,但是走一步算一步,只要坚持不倒退,总会到达目标的. ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0419/lists.png","http://www.iamyann.com/images/0426/20180426144747.png","http://www.iamyann.com/images/0426/20180424153117.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #21905156/Trx 7233599d3ca9556e2c8a043ff79b0ee87f638fcf
View Raw JSON Data
{
  "trx_id": "7233599d3ca9556e2c8a043ff79b0ee87f638fcf",
  "block": 21905156,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-26T12:56:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "yann-26",
      "title": "yann学长的运维开发指南26",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/0419/lists.png](http://www.iamyann.com/images/0419/lists.png)\n<!--more-->\n\n### 介绍\n\n单元测试小有成就,这次来做一下功能测试\n\n今天的具体内容如下:\n> * 表单及请求\n> * 关于表单的及简说明\n> * POST请求和GET\n\n\n\n### 表单及请求\n下面进入list项目的第5个小节,保存用户的输入内容,这节可是很长的,请大家做好准备.\n先从上次分享的大图上撕下一小块内容来,如图:\n![http://www.iamyann.com/images/0426/20180426144747.png](http://www.iamyann.com/images/0426/20180426144747.png)\n\n* 编写表单,发送POST请求\n  >提交表单\n  >面对面调试\n  >开放访问权限\n  >CSRF错误\n  >模板标签\n\n本来打算一气说下去的. 如何提交表单,再调试,开放django的访问权限,果断的遇到跨域错误,再解决掉,再把提交的内容通过特殊标签打入模板.\n\n不过为了我们可爱的雏鸟,我先把两块基础知识相关的内容说明一下吧.\n\n### 关于表单的及简说明\n表单是啥,我也说不清楚. 自我的理解就是一种网页组件,可以用来提交一些信息.比如我们最熟悉的登录页面.\n\n另外,表单元素是可以操作的,之前流行的自动登录脚本,就是对表单元素操作的结果.\n\n以下例子引自我最喜欢的w3school网站,如果人家来抗议的话,我会换成别家的.\n\n```html\n<!DOCTYPE html>\n<html>\n<body>\n\n<form action=\"/demo/demo_form.asp\">\nFirst name:<br>\n<input type=\"text\" name=\"firstname\" value=\"Mickey\">\n<br>\nLast name:<br>\n<input type=\"text\" name=\"lastname\" value=\" \">\n<br><br>\n<input type=\"submit\" value=\"Submit\">\n</form>\n\n<p>如果您点击提交,表单数据会被发送到名为 demo_form.asp 的页面。</p>\n\n</body>\n</html>\n```\n演示效果如图:\n![http://www.iamyann.com/images/0426/20180424153117.png](http://www.iamyann.com/images/0426/20180424153117.png)\n从界面看,比较重要的有输入框,提交按钮等\n从代码看,还需要注意 action, 指出向何处发送表单数据\n\n### POST请求和GET\n说完表单,我们还要说一下POST和GET,这东西嘛,我尽力说明,大家有个映象就行,实在理解不了,回头边敲代码边实践就好了.\n> * HTTP协议\nHTTP使用统一资源标识符(URI)来传输数据和建立连接.\nURL: 就是网址, 包括协议,域名,端口,虚拟目录,文件名,锚及参数\n\n> * URI和URL区别\n网上的文档,图像,视频,花鸟鱼虫都有URI,URL是一种特殊的URI\n\n> * HTTP状态码\n常见的500,404等,是服务端对客户端的响应\n\n> * GET 和POST请求\nGET和POST都是客户端向服务端请求方法,请求一定的Web页面的程序或用于特定的URL.\n  两者的主要差别是GET要提交数据的话,数据是放在URL里面的,非常不安全. 比如密码会被看到.\n  POST方法提交的数据是放在HTTP包的Body中,会好很多.\n\n\nps. 以上的说明非常的不完整,仅供科普,有意深究的同学请自己查询相关资料.\n### 预告\n今天没有代码,全是基础说明,请期待下一篇.\n\n上次是一小步,这次也是一小步,但是走一步算一步,只要坚持不倒退,总会到达目标的.\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0419/lists.png\",\"http://www.iamyann.com/images/0426/20180426144747.png\",\"http://www.iamyann.com/images/0426/20180424153117.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
dednovaupvoted (100.00%) @tmp4321 / part-1-yann-25
2018/04/24 16:58:09
voterdednova
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852468/Trx 2ff20db05bae320786d67179e894b6867ef44901
View Raw JSON Data
{
  "trx_id": "2ff20db05bae320786d67179e894b6867ef44901",
  "block": 21852468,
  "trx_in_block": 32,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:58:09",
  "op": [
    "vote",
    {
      "voter": "dednova",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
pobedasupvoted (100.00%) @tmp4321 / part-1-yann-25
2018/04/24 16:57:42
voterpobedas
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852459/Trx a3f03994b09e323b71870ef9872e3c63af0aba12
View Raw JSON Data
{
  "trx_id": "a3f03994b09e323b71870ef9872e3c63af0aba12",
  "block": 21852459,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:57:42",
  "op": [
    "vote",
    {
      "voter": "pobedas",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
2018/04/24 16:57:39
votervojnovanastya
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852458/Trx 609e37b08869226a1e2e429396abbb7a36dd59d0
View Raw JSON Data
{
  "trx_id": "609e37b08869226a1e2e429396abbb7a36dd59d0",
  "block": 21852458,
  "trx_in_block": 27,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:57:39",
  "op": [
    "vote",
    {
      "voter": "vojnovanastya",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
2018/04/24 16:57:33
votertczajkowski
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852456/Trx f49eed643421ec7794175261a902e0fe1c3d3621
View Raw JSON Data
{
  "trx_id": "f49eed643421ec7794175261a902e0fe1c3d3621",
  "block": 21852456,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:57:33",
  "op": [
    "vote",
    {
      "voter": "tczajkowski",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
2018/04/24 16:54:00
votercherekrest
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852385/Trx 6ab0e114dda1b294309c610384b458ae79125ba8
View Raw JSON Data
{
  "trx_id": "6ab0e114dda1b294309c610384b458ae79125ba8",
  "block": 21852385,
  "trx_in_block": 30,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:54:00",
  "op": [
    "vote",
    {
      "voter": "cherekrest",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
igor101upvoted (100.00%) @tmp4321 / part-1-yann-25
2018/04/24 16:54:00
voterigor101
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852385/Trx ccd492b008c9cb63611e53d1f1d16dec3a689360
View Raw JSON Data
{
  "trx_id": "ccd492b008c9cb63611e53d1f1d16dec3a689360",
  "block": 21852385,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:54:00",
  "op": [
    "vote",
    {
      "voter": "igor101",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
vikktoupvoted (100.00%) @tmp4321 / part-1-yann-25
2018/04/24 16:53:57
votervikkto
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852384/Trx ff10b9effd39d6c7a1ee0559589d45f780ebb357
View Raw JSON Data
{
  "trx_id": "ff10b9effd39d6c7a1ee0559589d45f780ebb357",
  "block": 21852384,
  "trx_in_block": 89,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:53:57",
  "op": [
    "vote",
    {
      "voter": "vikkto",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
krossovokupvoted (100.00%) @tmp4321 / part-1-yann-25
2018/04/24 16:53:57
voterkrossovok
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852384/Trx 41c9bab15a08cda9d13e1809933bb5baa4a622c2
View Raw JSON Data
{
  "trx_id": "41c9bab15a08cda9d13e1809933bb5baa4a622c2",
  "block": 21852384,
  "trx_in_block": 67,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:53:57",
  "op": [
    "vote",
    {
      "voter": "krossovok",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
2018/04/24 16:53:57
voterdolendoisirdya
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852384/Trx ae7a4a8ad388d24af6cd0f348d624db54f7f0fdc
View Raw JSON Data
{
  "trx_id": "ae7a4a8ad388d24af6cd0f348d624db54f7f0fdc",
  "block": 21852384,
  "trx_in_block": 32,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:53:57",
  "op": [
    "vote",
    {
      "voter": "dolendoisirdya",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
medvediupvoted (100.00%) @tmp4321 / part-1-yann-25
2018/04/24 16:53:54
votermedvedi
authortmp4321
permlinkpart-1-yann-25
weight10000 (100.00%)
Transaction InfoBlock #21852383/Trx 7466f7b73d8b34f3297afe25f08b5f336ab752ef
View Raw JSON Data
{
  "trx_id": "7466f7b73d8b34f3297afe25f08b5f336ab752ef",
  "block": 21852383,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T16:53:54",
  "op": [
    "vote",
    {
      "voter": "medvedi",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "weight": 10000
    }
  ]
}
tmp4321published a new post: part-1-yann-25
2018/04/24 08:23:00
parent author
parent permlinkdevops
authortmp4321
permlinkpart-1-yann-25
title测试回顾 part 1 - yann学长的运维开发指南25
body### 说明 目前的进度及后续的课程 ![http://www.iamyann.com/images/0419/lists.png](http://www.iamyann.com/images/0419/lists.png) <!--more--> ### 介绍 截至到上节,我们的进度到了一个小节点,对于首页的基本测试完成了. 本来打算上次分享上做总结的,谁知道堆积下来篇幅比较长,就放到这一次了. 具体内容如下: > * 总结回顾对于首页的测试 > * 说明保存用户输入 ### 总结回顾对于首页的测试 因为关于首页的测试,是本教程的第一篇测试,所以我们花点时间,把过程重新梳理一下: #### 从零开始 > * 我们先建了个Django的项目 django-admin.py startproject superlists . > * 然后建了一个应用 python manage.py startapp lists > * 在应用里的tests文件里写了一个测试 vi lists/tests.py > * 逐步把tests里的测试调试成功,期间修改了 urls和view文件 vi lists/views.py vi superlists/urls.py > * 为视图编写了一个单元测试 HomePageTest() vi lists/tests.py > * 调试通过后,又为其写了一个功能测试 vi functional_tests.py > * 证明功能测试工作正常后,我们扩充了功能测试的内容 vi functional_tests.py > * 正进一步的测试中,我们引入了模板,并重构了代码 vi lists/templates/home.html > * 因为测试失败,我们在settings里注册了lists应用 vi superlists/settings.py > * 逐步把functional_tests里的测试调试成功 vi lists/templates/home.html 以上就是目前的进度,跑到了靠近底部的功能测试,却无法通过,我们最后打了个标记在上面. ps. 如果大家git用的熟练,可以自己checkout 相关分支查看代码细节,如果不是很熟悉这方面的技巧,请查看我前几期分享的内容.github下载的代码显示的是最终提交结果,文件和内容可能和前期描述并不一致. ### 说明保存用户输入 下一章的内容很多,先借参考书的目录来当大纲吧,反正内容我是会自己写的: ![http://www.iamyann.com/images/20180424142642.png](http://www.iamyann.com/images/20180424142642.png) > 需要了解表单 > 发送POST请求 > 处理POST请求 > 把URL的变量传入模板 > 了解ORM工具 > 把POST请求传入数据库 > 以及重定向及模板渲染等 ### 预告 敲字真的很耗时间啊,半小时过去了. 大约就是以上的情况, 之所以做个总结 or 小结, 就是想告诉大家,我们的教程是连续的, 请放心跟随,不是东一锤西一棒子的知识百科. 上次是一小步,这次也是一小步,但是走一步算一步,只要坚持不倒退,总会到达目标的. ![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)
json metadata{"tags":["devops","python"],"image":["http://www.iamyann.com/images/0419/lists.png","http://www.iamyann.com/images/20180424142642.png","http://hero.iamyann.com/blog_webchat.jpg"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #21842214/Trx 6991602334dc4fc31eb60ebffb9d152ac9fe698f
View Raw JSON Data
{
  "trx_id": "6991602334dc4fc31eb60ebffb9d152ac9fe698f",
  "block": 21842214,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-24T08:23:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "devops",
      "author": "tmp4321",
      "permlink": "part-1-yann-25",
      "title": "测试回顾 part 1 - yann学长的运维开发指南25",
      "body": "### 说明\n目前的进度及后续的课程\n![http://www.iamyann.com/images/0419/lists.png](http://www.iamyann.com/images/0419/lists.png)\n<!--more-->\n\n### 介绍\n截至到上节,我们的进度到了一个小节点,对于首页的基本测试完成了. 本来打算上次分享上做总结的,谁知道堆积下来篇幅比较长,就放到这一次了.\n\n具体内容如下:\n> * 总结回顾对于首页的测试\n> * 说明保存用户输入\n\n\n\n### 总结回顾对于首页的测试\n因为关于首页的测试,是本教程的第一篇测试,所以我们花点时间,把过程重新梳理一下:\n\n#### 从零开始\n> * 我们先建了个Django的项目\ndjango-admin.py startproject superlists .\n\n> * 然后建了一个应用\npython manage.py startapp lists\n\n> * 在应用里的tests文件里写了一个测试\nvi lists/tests.py\n\n> * 逐步把tests里的测试调试成功,期间修改了 urls和view文件\nvi lists/views.py\nvi superlists/urls.py\n\n> * 为视图编写了一个单元测试 HomePageTest()\nvi lists/tests.py\n\n> * 调试通过后,又为其写了一个功能测试\nvi functional_tests.py\n\n> * 证明功能测试工作正常后,我们扩充了功能测试的内容\nvi functional_tests.py\n\n> * 正进一步的测试中,我们引入了模板,并重构了代码\nvi lists/templates/home.html\n\n> * 因为测试失败,我们在settings里注册了lists应用\nvi superlists/settings.py\n\n> * 逐步把functional_tests里的测试调试成功\nvi lists/templates/home.html\n\n以上就是目前的进度,跑到了靠近底部的功能测试,却无法通过,我们最后打了个标记在上面.\n\nps. 如果大家git用的熟练,可以自己checkout 相关分支查看代码细节,如果不是很熟悉这方面的技巧,请查看我前几期分享的内容.github下载的代码显示的是最终提交结果,文件和内容可能和前期描述并不一致.\n\n### 说明保存用户输入\n下一章的内容很多,先借参考书的目录来当大纲吧,反正内容我是会自己写的:\n![http://www.iamyann.com/images/20180424142642.png](http://www.iamyann.com/images/20180424142642.png)\n\n> 需要了解表单\n> 发送POST请求\n> 处理POST请求\n> 把URL的变量传入模板\n> 了解ORM工具\n> 把POST请求传入数据库\n> 以及重定向及模板渲染等\n\n\n### 预告\n敲字真的很耗时间啊,半小时过去了. 大约就是以上的情况, 之所以做个总结 or 小结, 就是想告诉大家,我们的教程是连续的, 请放心跟随,不是东一锤西一棒子的知识百科.\n\n上次是一小步,这次也是一小步,但是走一步算一步,只要坚持不倒退,总会到达目标的.\n\n\n![http://hero.iamyann.com/blog_webchat.jpg](http://hero.iamyann.com/blog_webchat.jpg)",
      "json_metadata": "{\"tags\":[\"devops\",\"python\"],\"image\":[\"http://www.iamyann.com/images/0419/lists.png\",\"http://www.iamyann.com/images/20180424142642.png\",\"http://hero.iamyann.com/blog_webchat.jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/04/23 02:04:48
parent authortmp4321
parent permlinkyann-18
authortmp4321
permlinkre-tmp4321-yann-18-20180423t020242668z
title
body请扫描二维码看微信上的版本,这个不知道为什么乱掉了,而且不能编辑,十分抱歉.
json metadata{"tags":["devops"],"app":"steemit/0.1"}
Transaction InfoBlock #21806378/Trx 6c1bc47c258af224f9f2b949788892eda7d3e802
View Raw JSON Data
{
  "trx_id": "6c1bc47c258af224f9f2b949788892eda7d3e802",
  "block": 21806378,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-23T02:04:48",
  "op": [
    "comment",
    {
      "parent_author": "tmp4321",
      "parent_permlink": "yann-18",
      "author": "tmp4321",
      "permlink": "re-tmp4321-yann-18-20180423t020242668z",
      "title": "",
      "body": "请扫描二维码看微信上的版本,这个不知道为什么乱掉了,而且不能编辑,十分抱歉.",
      "json_metadata": "{\"tags\":[\"devops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/04/23 02:03:51
parent authortmp4321
parent permlinkyann-18
authortmp4321
permlinkre-tmp4321-yann-18-20180423t020349833z
title
body请扫描二维码看微信上的版本,这个不知道为什么乱掉了,而且不能编辑,十分抱歉.
json metadata{"tags":["devops"],"app":"steemit/0.1"}
Transaction InfoBlock #21806359/Trx 88c74b1ccb2ee346b7e0a72717c90d1cf44571df
View Raw JSON Data
{
  "trx_id": "88c74b1ccb2ee346b7e0a72717c90d1cf44571df",
  "block": 21806359,
  "trx_in_block": 42,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-23T02:03:51",
  "op": [
    "comment",
    {
      "parent_author": "tmp4321",
      "parent_permlink": "yann-18",
      "author": "tmp4321",
      "permlink": "re-tmp4321-yann-18-20180423t020349833z",
      "title": "",
      "body": "请扫描二维码看微信上的版本,这个不知道为什么乱掉了,而且不能编辑,十分抱歉.",
      "json_metadata": "{\"tags\":[\"devops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
pilyugupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:42:24
voterpilyug
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795131/Trx 1d57251d075d3160ee2330575f0658967fe6ee49
View Raw JSON Data
{
  "trx_id": "1d57251d075d3160ee2330575f0658967fe6ee49",
  "block": 21795131,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:42:24",
  "op": [
    "vote",
    {
      "voter": "pilyug",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
iksarupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:42:21
voteriksar
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795130/Trx e89f3c38e5c52e58e997eacea0bcfaac7f1e5357
View Raw JSON Data
{
  "trx_id": "e89f3c38e5c52e58e997eacea0bcfaac7f1e5357",
  "block": 21795130,
  "trx_in_block": 62,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:42:21",
  "op": [
    "vote",
    {
      "voter": "iksar",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
sauninaupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:42:12
votersaunina
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795127/Trx d15c435240f4d1189cb3bf97f1b9c9360b52a793
View Raw JSON Data
{
  "trx_id": "d15c435240f4d1189cb3bf97f1b9c9360b52a793",
  "block": 21795127,
  "trx_in_block": 46,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:42:12",
  "op": [
    "vote",
    {
      "voter": "saunina",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
teodotrshmidupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:42:09
voterteodotrshmid
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795126/Trx 1e7e21bacc272190eb7c4ce22d936f467a6a2b50
View Raw JSON Data
{
  "trx_id": "1e7e21bacc272190eb7c4ce22d936f467a6a2b50",
  "block": 21795126,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:42:09",
  "op": [
    "vote",
    {
      "voter": "teodotrshmid",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
dakhnovaupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:42:09
voterdakhnova
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795126/Trx 797c3bb8dab82f567aeac70a795d08329b19d8ec
View Raw JSON Data
{
  "trx_id": "797c3bb8dab82f567aeac70a795d08329b19d8ec",
  "block": 21795126,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:42:09",
  "op": [
    "vote",
    {
      "voter": "dakhnova",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
robsaupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:42:06
voterrobsa
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795125/Trx 897189405cff316954eb5919b865d63401c73de1
View Raw JSON Data
{
  "trx_id": "897189405cff316954eb5919b865d63401c73de1",
  "block": 21795125,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:42:06",
  "op": [
    "vote",
    {
      "voter": "robsa",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
ebyjh1024upvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:41:54
voterebyjh1024
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795121/Trx 4576d7182fb35c1a71cdaefd5122b54df373ee99
View Raw JSON Data
{
  "trx_id": "4576d7182fb35c1a71cdaefd5122b54df373ee99",
  "block": 21795121,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:41:54",
  "op": [
    "vote",
    {
      "voter": "ebyjh1024",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
nikolasantiupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:41:48
voternikolasanti
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795119/Trx 3b0fe50b9e6478c8980ad7725ba21b1fa2adc0fc
View Raw JSON Data
{
  "trx_id": "3b0fe50b9e6478c8980ad7725ba21b1fa2adc0fc",
  "block": 21795119,
  "trx_in_block": 31,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:41:48",
  "op": [
    "vote",
    {
      "voter": "nikolasanti",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
baanakliuupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:41:45
voterbaanakliu
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795118/Trx 00250a1e72fba48cc50bdebedf8c9655f9d03d89
View Raw JSON Data
{
  "trx_id": "00250a1e72fba48cc50bdebedf8c9655f9d03d89",
  "block": 21795118,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:41:45",
  "op": [
    "vote",
    {
      "voter": "baanakliu",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
belochupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:41:45
voterbeloch
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795118/Trx 6d2205d3bfc5dfa85d53807dee6f5ff51c45d962
View Raw JSON Data
{
  "trx_id": "6d2205d3bfc5dfa85d53807dee6f5ff51c45d962",
  "block": 21795118,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:41:45",
  "op": [
    "vote",
    {
      "voter": "beloch",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
tsudev5upvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:41:45
votertsudev5
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795118/Trx d91815f84c22deb5b3026b9f42a3b3a697276dbf
View Raw JSON Data
{
  "trx_id": "d91815f84c22deb5b3026b9f42a3b3a697276dbf",
  "block": 21795118,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:41:45",
  "op": [
    "vote",
    {
      "voter": "tsudev5",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
zoretkoupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:41:42
voterzoretko
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795117/Trx e1197bb5a58ed62957705cbaa9f12d8b4ea4c3c1
View Raw JSON Data
{
  "trx_id": "e1197bb5a58ed62957705cbaa9f12d8b4ea4c3c1",
  "block": 21795117,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:41:42",
  "op": [
    "vote",
    {
      "voter": "zoretko",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}
larsandupvoted (100.00%) @tmp4321 / yann-24
2018/04/22 16:41:39
voterlarsand
authortmp4321
permlinkyann-24
weight10000 (100.00%)
Transaction InfoBlock #21795116/Trx c259aaf28b9923a4961be13b23e92fe8cdd9fc26
View Raw JSON Data
{
  "trx_id": "c259aaf28b9923a4961be13b23e92fe8cdd9fc26",
  "block": 21795116,
  "trx_in_block": 75,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-22T16:41:39",
  "op": [
    "vote",
    {
      "voter": "larsand",
      "author": "tmp4321",
      "permlink": "yann-24",
      "weight": 10000
    }
  ]
}

Account Metadata

POSTING JSON METADATA
None
JSON METADATA
None
{
  "posting_json_metadata": {},
  "json_metadata": {}
}

Auth Keys

Owner
Single Signature
Public Keys
STM6ddztSHnrXNBQsaroMiiStsv7yn9ax8c6RRwJtiy3B9NijyHSB1/1
Active
Single Signature
Public Keys
STM7nLpGGfSiqhZjsTev6Zqhu6V1BKDf5Qz7WgdNQdWsG45h7a4PL1/1
Posting
Single Signature
Public Keys
STM7iiWNebsCsEcFugUYPM7wLhXLE9Y2auZuqszLand8XBpfvREPy1/1
Memo
STM6UXHvW6ZyyD9VTTRAKEP6V2XH8oL8jfXqdHXRxTMp37JVRFrVz
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6ddztSHnrXNBQsaroMiiStsv7yn9ax8c6RRwJtiy3B9NijyHSB",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7nLpGGfSiqhZjsTev6Zqhu6V1BKDf5Qz7WgdNQdWsG45h7a4PL",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7iiWNebsCsEcFugUYPM7wLhXLE9Y2auZuqszLand8XBpfvREPy",
        1
      ]
    ]
  },
  "memo": "STM6UXHvW6ZyyD9VTTRAKEP6V2XH8oL8jfXqdHXRxTMp37JVRFrVz"
}

Witness Votes

0 / 30
No active witness votes.
[]