[{"data":1,"prerenderedAt":572},["ShallowReactive",2],{"\u002Fblog\u002Fprogramming\u002Fcloud-storage-cache-control":3,"relation-articles\u002Fblog\u002Fprogramming\u002Fcloud-storage-cache-controlシステム開発":477,"recommented-articles\u002Fblog\u002Fprogramming\u002Fcloud-storage-cache-controlシステム開発":527},{"id":4,"title":5,"body":6,"category":463,"createdAt":464,"description":465,"extension":466,"isRecommend":467,"meta":468,"navigation":119,"path":469,"seo":470,"stem":471,"subCategory":472,"tags":473,"thumbnail":302,"updatedAt":475,"__hash__":476},"blog\u002Fblog\u002Fprogramming\u002Fcloud-storage-cache-control.md","【Python】Cloud StorageにアップロードするオブジェクトのCache-Controlを変更する",{"type":7,"value":8,"toc":453},"minimark",[9,13,17,27,30,34,222,225,242,245,298,303,306,309,312,330,333,352,355,417,420,424,427,430,437,440,449],[10,11,12],"h2",{"id":12},"概要",[14,15,16],"p",{},"PythonでCloud StorageにアップロードするオブジェクトのCache-Controlを変更する方法を記載します。",[14,18,19,26],{},[20,21,25],"a",{"href":22,"rel":23},"https:\u002F\u002Fcloud.google.com\u002Fstorage\u002Fdocs\u002Fviewing-editing-metadata?hl=ja#edit",[24],"nofollow","公式のドキュメント","にPythonのサンプルコードがなく、詰まるポイントがあったので注意点についても解説します。",[10,28,29],{"id":29},"設定方法",[31,32,33],"h3",{"id":33},"全体のコード",[35,36,42],"pre",{"className":37,"code":38,"filename":39,"language":40,"meta":41,"style":41},"language-python shiki shiki-themes github-dark","def main():\n    _, temp_local_filename = tempfile.mkstemp()\n    with codecs.open(temp_local_filename, 'w', 'utf_8') as f:\n        f.write('テキスト')\n\n    os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"] = 'credencialsファイル名'\n    client = storage.Client()\n    bucket = client.get_bucket('バケット名')\n    blob = bucket.blob('アップロード先ファイル名')\n    blob.upload_from_filename(filename=temp_local_filename)\n    blob.cache_control = 'no-cache'\n    blob.patch()\n    return \"success\"\n","upload.py","python","",[43,44,45,62,74,102,114,121,138,149,165,181,196,207,213],"code",{"__ignoreMap":41},[46,47,50,54,58],"span",{"class":48,"line":49},"line",1,[46,51,53],{"class":52},"snl16","def",[46,55,57],{"class":56},"svObZ"," main",[46,59,61],{"class":60},"s95oV","():\n",[46,63,65,68,71],{"class":48,"line":64},2,[46,66,67],{"class":60},"    _, temp_local_filename ",[46,69,70],{"class":52},"=",[46,72,73],{"class":60}," tempfile.mkstemp()\n",[46,75,77,80,83,87,90,93,96,99],{"class":48,"line":76},3,[46,78,79],{"class":52},"    with",[46,81,82],{"class":60}," codecs.open(temp_local_filename, ",[46,84,86],{"class":85},"sU2Wk","'w'",[46,88,89],{"class":60},", ",[46,91,92],{"class":85},"'utf_8'",[46,94,95],{"class":60},") ",[46,97,98],{"class":52},"as",[46,100,101],{"class":60}," f:\n",[46,103,105,108,111],{"class":48,"line":104},4,[46,106,107],{"class":60},"        f.write(",[46,109,110],{"class":85},"'テキスト'",[46,112,113],{"class":60},")\n",[46,115,117],{"class":48,"line":116},5,[46,118,120],{"emptyLinePlaceholder":119},true,"\n",[46,122,124,127,130,133,135],{"class":48,"line":123},6,[46,125,126],{"class":60},"    os.environ[",[46,128,129],{"class":85},"\"GOOGLE_APPLICATION_CREDENTIALS\"",[46,131,132],{"class":60},"] ",[46,134,70],{"class":52},[46,136,137],{"class":85}," 'credencialsファイル名'\n",[46,139,141,144,146],{"class":48,"line":140},7,[46,142,143],{"class":60},"    client ",[46,145,70],{"class":52},[46,147,148],{"class":60}," storage.Client()\n",[46,150,152,155,157,160,163],{"class":48,"line":151},8,[46,153,154],{"class":60},"    bucket ",[46,156,70],{"class":52},[46,158,159],{"class":60}," client.get_bucket(",[46,161,162],{"class":85},"'バケット名'",[46,164,113],{"class":60},[46,166,168,171,173,176,179],{"class":48,"line":167},9,[46,169,170],{"class":60},"    blob ",[46,172,70],{"class":52},[46,174,175],{"class":60}," bucket.blob(",[46,177,178],{"class":85},"'アップロード先ファイル名'",[46,180,113],{"class":60},[46,182,184,187,191,193],{"class":48,"line":183},10,[46,185,186],{"class":60},"    blob.upload_from_filename(",[46,188,190],{"class":189},"s9osk","filename",[46,192,70],{"class":52},[46,194,195],{"class":60},"temp_local_filename)\n",[46,197,199,202,204],{"class":48,"line":198},11,[46,200,201],{"class":60},"    blob.cache_control ",[46,203,70],{"class":52},[46,205,206],{"class":85}," 'no-cache'\n",[46,208,210],{"class":48,"line":209},12,[46,211,212],{"class":60},"    blob.patch()\n",[46,214,216,219],{"class":48,"line":215},13,[46,217,218],{"class":52},"    return",[46,220,221],{"class":85}," \"success\"\n",[31,223,224],{"id":224},"正しい方法",[35,226,228],{"className":37,"code":227,"filename":39,"language":40,"meta":41,"style":41},"    blob.cache_control = 'no-cache'\n    blob.patch()\n",[43,229,230,238],{"__ignoreMap":41},[46,231,232,234,236],{"class":48,"line":49},[46,233,201],{"class":60},[46,235,70],{"class":52},[46,237,206],{"class":85},[46,239,240],{"class":48,"line":64},[46,241,212],{"class":60},[14,243,244],{},"設定されているか確認します。",[35,246,250],{"className":247,"code":248,"language":249,"meta":41,"style":41},"language-bash shiki shiki-themes github-dark","$ curl -v \"https:\u002F\u002Fstorage.googleapis.com\u002Fバケット名\u002Fファイル名\" 2>&1 | grep -i Cache-Control\n* h2 header: cache-control: no-cache\n\u003C cache-control: no-cache\n","bash",[43,251,252,282,290],{"__ignoreMap":41},[46,253,254,257,260,264,267,270,273,276,279],{"class":48,"line":49},[46,255,256],{"class":56},"$",[46,258,259],{"class":85}," curl",[46,261,263],{"class":262},"sDLfK"," -v",[46,265,266],{"class":85}," \"https:\u002F\u002Fstorage.googleapis.com\u002Fバケット名\u002Fファイル名\"",[46,268,269],{"class":52}," 2>&1",[46,271,272],{"class":52}," |",[46,274,275],{"class":56}," grep",[46,277,278],{"class":262}," -i",[46,280,281],{"class":85}," Cache-Control\n",[46,283,284,287],{"class":48,"line":64},[46,285,286],{"class":52},"*",[46,288,289],{"class":60}," h2 header: cache-control: no-cache\n",[46,291,292,295],{"class":48,"line":76},[46,293,294],{"class":52},"\u003C",[46,296,297],{"class":60}," cache-control: no-cache\n",[299,300],"img",{"alt":301,"src":302},"正しく設定されている","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_cloud-storage-cache-control_ok.webp",[14,304,305],{},"Cache-Controlがno-cacheになりました。",[31,307,308],{"id":308},"間違った方法",[14,310,311],{},"metadataには",[313,314,315,323],"ul",{},[316,317,318],"li",{},[20,319,322],{"href":320,"rel":321},"https:\u002F\u002Fcloud.google.com\u002Fstorage\u002Fdocs\u002Fmetadata?hl=ja#mutable",[24],"固定キーデータ",[316,324,325],{},[20,326,329],{"href":327,"rel":328},"https:\u002F\u002Fcloud.google.com\u002Fstorage\u002Fdocs\u002Fmetadata?hl=ja#custom-metadata",[24],"カスタムメタデータ",[14,331,332],{},"があり、Cache-Controlは固定キーデータにあたります。以下のコードはカスタムメタデータを設定するため、Cache-Controlが正常に設定されません。",[35,334,336],{"className":37,"code":335,"filename":39,"language":40,"meta":41,"style":41},"    blob.metadata['Cache-Control'] = 'no-cache'\n",[43,337,338],{"__ignoreMap":41},[46,339,340,343,346,348,350],{"class":48,"line":49},[46,341,342],{"class":60},"    blob.metadata[",[46,344,345],{"class":85},"'Cache-Control'",[46,347,132],{"class":60},[46,349,70],{"class":52},[46,351,206],{"class":85},[14,353,354],{},"どのように設定されているか確認します。",[35,356,358],{"className":247,"code":357,"language":249,"meta":41,"style":41},"$ curl -v \"https:\u002F\u002Fstorage.googleapis.com\u002Fバケット名\u002Fファイル名\" 2>&1 | grep -i Cache-Control\n* h2 header: cache-control: public, max-age=3600\n* h2 header: x-goog-meta-cache-control: no-cache\n\u003C cache-control: public, max-age=3600\n\u003C x-goog-meta-cache-control: no-cache\n",[43,359,360,380,392,399,410],{"__ignoreMap":41},[46,361,362,364,366,368,370,372,374,376,378],{"class":48,"line":49},[46,363,256],{"class":56},[46,365,259],{"class":85},[46,367,263],{"class":262},[46,369,266],{"class":85},[46,371,269],{"class":52},[46,373,272],{"class":52},[46,375,275],{"class":56},[46,377,278],{"class":262},[46,379,281],{"class":85},[46,381,382,384,387,389],{"class":48,"line":64},[46,383,286],{"class":52},[46,385,386],{"class":60}," h2 header: cache-control: public, max-age",[46,388,70],{"class":52},[46,390,391],{"class":85},"3600\n",[46,393,394,396],{"class":48,"line":76},[46,395,286],{"class":52},[46,397,398],{"class":60}," h2 header: x-goog-meta-cache-control: no-cache\n",[46,400,401,403,406,408],{"class":48,"line":104},[46,402,294],{"class":52},[46,404,405],{"class":60}," cache-control: public, max-age",[46,407,70],{"class":52},[46,409,391],{"class":85},[46,411,412,414],{"class":48,"line":116},[46,413,294],{"class":52},[46,415,416],{"class":60}," x-goog-meta-cache-control: no-cache\n",[14,418,419],{},"x-goog-meta-cache-controlに設定されてしまっています。",[299,421],{"alt":422,"src":423},"間違った設定をされている","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_cloud-storage-cache-control_ng.webp",[14,425,426],{},"コンソールで見ても本来のCache-Controlとは別項目に値が設定されています。",[10,428,429],{"id":429},"まとめ",[14,431,432,433,436],{},"オブジェクトのCache-Controlを変更する方法について解説しました。",[434,435],"br",{},"\n設定値はCLIやコンソールから確認することができるため、正しく設定されているか確認をしましょう。",[10,438,439],{"id":439},"参考",[313,441,442],{},[316,443,444],{},[20,445,448],{"href":446,"rel":447},"https:\u002F\u002Fgithub.com\u002Fgoogleapis\u002Fgoogle-cloud-python\u002Fissues\u002F3099",[24],"Setting Content-Encoding header for Cloud Storage Uploads with upload_from_file",[450,451,452],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":41,"searchDepth":64,"depth":64,"links":454},[455,456,461,462],{"id":12,"depth":64,"text":12},{"id":29,"depth":64,"text":29,"children":457},[458,459,460],{"id":33,"depth":76,"text":33},{"id":224,"depth":76,"text":224},{"id":308,"depth":76,"text":308},{"id":429,"depth":64,"text":429},{"id":439,"depth":64,"text":439},"システム開発","2023\u002F08\u002F01","PythonでCloud StorageにアップロードするオブジェクトのCache-Controlを変更する方法を解説します。","md",false,{},"\u002Fblog\u002Fprogramming\u002Fcloud-storage-cache-control",{"title":5,"description":465},"blog\u002Fprogramming\u002Fcloud-storage-cache-control","Cloud Storage",[474,472],"Python",null,"m-raJNSTt1knBrT0L7xHxH64V3Qg2iklEw433FQBA94",[478,487,496,503,512,518],{"id":479,"path":480,"title":481,"category":463,"tags":482,"thumbnail":485,"createdAt":486,"updatedAt":475},"blog\u002Fblog\u002Fprogramming\u002Faws-iam-passkey.md","\u002Fblog\u002Fprogramming\u002Faws-iam-passkey","AWS IAMでPasskeyが利用可能に Windows PCで指紋認証を設定してみました",[483,484],"AWS","Windows","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002F2024-08-22_11-12-41_nvre36gj.webp","2024\u002F08\u002F22",{"id":488,"path":489,"title":490,"category":463,"tags":491,"thumbnail":494,"createdAt":495,"updatedAt":475},"blog\u002Fblog\u002Fprogramming\u002Freact-tutorial-vue.md","\u002Fblog\u002Fprogramming\u002Freact-tutorial-vue","React公式チュートリアルをVueでも書いて比較してみた",[492,493],"React.js","Vue.js","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_react-vue_react-vue.webp","2024\u002F06\u002F22",{"id":497,"path":498,"title":499,"category":463,"tags":500,"thumbnail":501,"createdAt":502,"updatedAt":475},"blog\u002Fblog\u002Fprogramming\u002Fvue-scoped-css.md","\u002Fblog\u002Fprogramming\u002Fvue-scoped-css","Vueのスコープ付きCSSで子コンポーネントにCSSを適用する【Vue3】",[493],"https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_vue-define-model_vue.webp","2024\u002F06\u002F12",{"id":504,"path":505,"title":506,"category":463,"tags":507,"thumbnail":510,"createdAt":511,"updatedAt":475},"blog\u002Fblog\u002Fprogramming\u002Fvercel-vs-amplify.md","\u002Fblog\u002Fprogramming\u002Fvercel-vs-amplify","Vercel(Hobby)→AWS Amplify 移行して分かった両者の違い",[508,509],"Vercel","Amplify","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_vercel-vs-amplify_vercel-amplify.webp","2024\u002F05\u002F17",{"id":513,"path":514,"title":515,"category":463,"tags":516,"thumbnail":501,"createdAt":517,"updatedAt":475},"blog\u002Fblog\u002Fprogramming\u002Fvue-playground.md","\u002Fblog\u002Fprogramming\u002Fvue-playground","手軽に使えるVueプレイグラウンド環境。Vue SFC Playground解説",[493],"2024\u002F04\u002F08",{"id":519,"path":520,"title":521,"category":463,"tags":522,"thumbnail":525,"createdAt":526,"updatedAt":475},"blog\u002Fblog\u002Fprogramming\u002Ftailwind-css-v4-install.md","\u002Fblog\u002Fprogramming\u002Ftailwind-css-v4-install","Vite、TailwindCSS v4環境を構築【Tailwind CSS v4-alpha】",[523,524],"Tailwind CSS","Vite","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_tailwind-css-v4-install_tailwind-css.webp","2024\u002F03\u002F07",[528,530,541,547,557,566],{"id":488,"path":489,"title":490,"category":463,"tags":529,"thumbnail":494,"createdAt":495,"updatedAt":475},[492,493],{"id":531,"path":532,"title":533,"category":463,"tags":534,"thumbnail":538,"createdAt":539,"updatedAt":540},"blog\u002Fblog\u002Fprogramming\u002Fnpm-develop.md","\u002Fblog\u002Fprogramming\u002Fnpm-develop","フロントエンド開発体験を向上させる10のnpmライブラリ【2024年版】",[535,536,537],"JavaScript","TypeScript","npm","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_npm-develop_thumbnail.webp","2024\u002F01\u002F14","2024\u002F01\u002F19",{"id":542,"path":543,"title":544,"category":463,"tags":545,"thumbnail":501,"createdAt":546,"updatedAt":526},"blog\u002Fblog\u002Fprogramming\u002Fvue-define-model.md","\u002Fblog\u002Fprogramming\u002Fvue-define-model","VueのdefineModelを活用した入力コンポーネントの作成方法【Vue3.4】",[493],"2024\u002F01\u002F07",{"id":548,"path":549,"title":550,"category":463,"tags":551,"thumbnail":554,"createdAt":555,"updatedAt":556},"blog\u002Fblog\u002Fprogramming\u002Fnuxt-storybook.md","\u002Fblog\u002Fprogramming\u002Fnuxt-storybook","Nuxt3にStorybookを導入する方法",[552,553],"NuxtJS","Storybook","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_nuxt-storybook_thumbnail.webp","2023\u002F11\u002F22","2024\u002F03\u002F18",{"id":558,"path":559,"title":560,"category":463,"tags":561,"thumbnail":564,"createdAt":565,"updatedAt":540},"blog\u002Fblog\u002Fprogramming\u002Fnuxt-blog.md","\u002Fblog\u002Fprogramming\u002Fnuxt-blog","NuxtJSを使ってブログを作ってみた【Nuxt Content\u002FTailwindCSS\u002FdaisyUI】",[552,493,562,563],"TailwindCSS","ブログ","https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_nuxt-blog_thumbnail.webp","2023\u002F08\u002F25",{"id":567,"path":568,"title":569,"category":463,"tags":570,"thumbnail":571,"createdAt":464,"updatedAt":475},"blog\u002Fblog\u002Fprogramming\u002Fchat-scroll.md","\u002Fblog\u002Fprogramming\u002Fchat-scroll","メッセージ送受信時にスクロール位置を最下部に維持する処理を実装【TypeScript\u002FVue.js】",[535,536,493],"https:\u002F\u002Fimg-blog.ashcolor.jp\u002Fimg\u002Fpc\u002Fprogramming_chat-scroll_thumbnail.webp",1793496013047]