02djangoå¼åå客系ç»ä¹å端å¼å
ä¸ãæ°æ®åºå¢å æ¹æ¥
1. æ°æ®åºçå¢å æ¹æ¥æä½
æ¹å¼1ï¼SQLè¯å¥
Pythonæè¯»åæ°æ®åºç模åï¼å¯ä»¥éè¿SQLè¯å¥å®ç°ç¨åºåæ°æ®åºç交äºã
æ¹å¼2ï¼Djangoå ç½®çAPI
æ¢ç¶ä½¿ç¨Djangoè¿ä¸ªWebæ¡æ¶æå»ºç½ç«ï¼é£ä¹å°±åºè¯¥ä½¿ç¨Djangoçè§å廿使°æ®åºãDjangoæä¾äºä¸ç³»åæ½è±¡çAPIç¨äºæ°æ®åºçå¢å æ¹æ¥ã
为æ¹ä¾¿è¿è¡æ°æ®æµè¯ï¼å æ°å¢ä¸ä¸ªç®¡çåç¨æ·ï¼ç´æ¥å¨åå°ç®¡çç颿ä½å³å¯ï¼å¦ä¸å¾ï¼
ç°å¨æä¸¤ä¸ªåå°ç®¡çç¨æ·ï¼ææ°æ®åºæä»¶ä¸è½½å°windowsä¸ï¼ä½¿ç¨SQLitesPyå·¥å ·æå¼ã
1.1 æ°æ®è¡¨ç»æåæ°æ®æ¨¡åç±»ç对åºå ³ç³»
|
Djangoå ç½®API
|
1.2 Useræ°æ®æ¨¡åç±»
è¿æ¯Djangoé»è®¤æçæ°æ®æ¨¡åç±»ï¼å¨æ°æ®åºæä»¶ä¸ï¼çæå¯¹åºçæ°æ®è¡¨å为auth_userã
ï¼1ï¼æ¥è¯¢è¿ä¸ªè¡¨æå¤å°æ¡è®°å½
æ¹å¼1ï¼SQLè¯å¥
SELECT * FROM auth_user |
æ¥è¯¢ç»æå¦ä¸å¾
è¿ä¸¤æ¡è®°å½åå«å¯¹åºå建ç两个åå°ç®¡çç¨æ·æ°æ®ä¿¡æ¯ã
æ¹å¼2ï¼Djangoå ç½®API
对äºPythonæ¥è¯´ï¼å°±æ¯è·åææç对象å®ä¾ã
1ï¼ å è¿å ¥shellå½ä»¤è¡æ¨¡å¼ï¼å½ä»¤ï¼
python manage.py shell |
2ï¼ å¯¼åºUser模å
from django.contrib.auth.models import User |
3ï¼ è·å¾ææç对象ï¼è·å¾ææçè®°å½ï¼ã
record = User.objects.all() |
å¦ä¸å¾
ï¼2ï¼æç §æä¸ªå段对记å½è¿è¡çé
æ¯å¦ï¼çéåºusernameè¿ä¸ªå段为adminçè¿æ¡/è¿äºè®°å½ã
æ¹å¼1ï¼SQLè¯å¥
SELECT * FROM auth_user WHERE username = 'admin' |
æ¥è¯¢ç»æå¦ä¸å¾
æ¹å¼2ï¼Djangoå ç½®API
对äºPythonæ¥è¯´ï¼å°±æ¯çéä¼å¤å¯¹è±¡ä¸ç¬¦åç鿡件çæä¸ª/æäºå®ä¾ã
çé对象çå½ä»¤ä¸º
user = User.objects.get(username='admin') |
çéåºusername为adminçè¿æ¡è®°å½ï¼è¿ä¸ªå¯¹è±¡ï¼
æå¯¹è±¡çåä¸ªå±æ§é½æå°åºæ¥
[email protected]:/home/wgp/django_site# python manage.py shell Python 3.5.2 (default, Apr 16 2020, 17:47:17) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from django.contrib.auth.models import User >>> >>> >>> user = User.objects.get(username='admin') >>> >>> user <User: admin> >>>
>>> user.username 'admin'
>>> user.id 2
>>> user.first_name 'ç'
>>> user.last_name 'å½è¾'
>>> user.email
>>> user.date_joined datetime.datetime(2020, 6, 4, 2, 10, 31, 255887, tzinfo=<UTC>)
|
å使ç¨SQLè¯å¥æä½æ°æ®åºçæææ¯ä¸æ ·çï¼å¦ä¸å¾ã
1.3 BlogArticlesæ°æ®æ¨¡åç±»
è¿ä¸ªç±»æ¯èªå·±åçï¼åæ ·å¯ä»¥å°æ°æ®åºä¸çææè®°å½é½è¯»åºæ¥ã
é¦å ï¼æç¡®æ¯æ¡è®°å½ä¸æå ä¸ªåæ®µï¼å段çåå¼åå«ä¹æ¯ä»ä¹ï¼å¯ä»¥æ¥çç¼åç代ç ï¼ä½æ¯æ´ç´è§çæ¯å¨æ°æ®åºç®¡çå·¥å ·SQLitesPyä¸ç´æ¥æ¥çï¼å¦ä¸å¾ã
ç¼è¾äºä¸ç¯å客ï¼å°±æä¸æ¡è®°å½ï¼æ¯æ¡è®°å½ä¸æåä¸ªåæ®µï¼å¯¹åºçæ°æ®æ¨¡åç±»éé¢çåä¸ªå±æ§ã
æ¹å¼1ï¼SQLè¯å¥æä½æ°æ®åº
è¯å¥
SELECT * FROM blog_blogarticles |
ç»æå¦ä¸å¾
å¯¹æ°æ®è¡¨ä¸çææè®°å½ææ¡ä»¶ï¼idè¿ä¸ªå段çå¼ï¼è¿è¡çéï¼è¯å¥ä¸ºï¼
SELECT * FROM blog_blogarticles WHERE id = '3' |
ç»æå¦ä¸å¾
åid为3çè¿æ¡è®°å½çbodyåæ®µçå¼ï¼è¯å¥ä¸º
SELECT body FROM blog_blogarticles WHERE id = '3' |
ç»æå¦ä¸å¾
æ¹å¼2ï¼DjangoçAPI
导åºBlogArticles模å
from blog.models import BlogArticles |
以idä½ä¸ºè®°å½çéçæ¡ä»¶ï¼æå°åºæ¯ä¸ä¸ªè®°å½çtitleåæ®µï¼å¦ä¸å¾ã
äºãæ¾ç¤ºå客æç« æ é¢
1. ç¼åè§å¾å½æ°
å°æ°æ®åºä¸çæ°æ®æ¾å ¥å段ç½é¡µä¸æ¾ç¤ºä¹åï¼é¦å å°æ°æ®è¯»åºãéè¦å¨è§å¾æä»¶view.pyä¸ç¼åè§å¾å½æ°ï¼è¯»åºæ°æ®åºä¸çæ°æ®ã
è§å¾æä»¶(views.py)ä½äºAPPç®å½ä¸ã
æä»¶æåçç»æå¦ä¸å¾
æ°å¢è¯»åæ é¢(title)ç彿°ï¼å¦ä¸å¾ã
è§å¾å½æ°æ¯ç¨æ¥ååºç¨æ·è¯·æ±çï¼å®çç¼åè§åæ¯ï¼
1. 彿°è³å°æä¸ä¸ªåæ°ï¼å¹¶ä¸åç§°æ¯requestï¼å¹¶ä¸æ¯ç¬¬ä¸ä¸ªåæ°ï¼åé¢å¯æ ¹æ®å®é æ åµå¢å å«çåæ°ï¼å½åèªç±ã
2. 彿°ä»¥returnç»æï¼è¿åç»æãrender()彿°çä½ç¨æ¯ææ°æ®æ¸²æå°æå®ç模æ¿ä¸ï¼å æ¤å®çä¸ä¸ªåæ°å«ä¹å嫿¯ï¼åæ°1å¿ é¡»æ¯requestï¼åæ°2模æ¿çä½ç½®ï¼åæ°3æ¯ä¼ å ¥æ¨¡æ¿çæ°æ®ï¼ä»¥åå ¸ãé®å¼å¯¹ãçå½¢å¼ä¼ ç»æ¨¡æ¿ã
é£ä¹å°åºä»ä¹æ¯æ¨¡æ¿ï¼ä»ä¸é¢ç¼åç代ç ä¸ä¸é¾çåºï¼æ¨¡æ¿å ¶å®å°±æ¯ä¸ä¸ªhtmlæä»¶ã
2. æ°å»ºæ¨¡æ¿
ç¨äºå°ç¨æ·è¯·æ±çå 容å±ç°å¨å端çç½é¡µï¼å°±æ¯æ¨¡æ¿ãæ¨¡æ¿æ¯ä¸ä¸ªhtmlæä»¶ï¼å¹¶ä¸ä½ä¸ºrender()ç第äºä¸ªåæ°ãç®å对äºblogè¿ä¸ªappï¼è¿æ²¡ææ¨¡æ¿ï¼å æ¤éè¦æ°å»ºä¸ä¸ªæ¨¡æ¿ï¼ç¨æ¥æ¾ç¤ºåå®¢çæ é¢å表ã
ä¸ç³»åçå½ä»¤
mkdir templates ......................... |
å¦ä¸å¾
å¨appç®å½ä¸æ°å»ºä¸ä¸ªæ¨¡æ¿ç®å½ï¼å½å为templatesï¼å¨templatesç®å½ä¸æ°å»ºä¸ä¸ªbase.htmlåä¸ä¸ªç®å½blogï¼å¨blogç®å½ä¸ï¼åæ°å»ºä¸ä¸ªtitles.htmlæä»¶ã
è§åè§£æï¼
ï¼1ï¼æ¨¡æ¿ç®å½è¦ä½äºappç®å½ä¸ï¼templatesæ¯Djangoé»è®¤çåæ¾è¯¥appçæ¨¡æ¿ç®å½ï¼å æ¤å¦ææ¨¡æ¿ç®å½å½å为templatesï¼årender()ç第äºä¸ªåæ°å¯ä»¥ä¸ç¨æå®æ¨¡æ¿çä½ç½®ï¼Djangoé»è®¤å°templatesç®å½ä¸å»å¯»æ¾æå®ç模æ¿ï¼æ¯å¦è¿è¡ä»£ç ï¼
return render(request, "blog/title.html", {"blogs:blogs"}) |
å®é ä¸çåäº
return render(request, "templates/blog/title.html", {"blogs:blogs"}) |
妿ä¸ä»¥templatesæ¥å½å模æ¿ç®å½ï¼åä¼ éåæ°çæ¶åï¼éè¦æå®åç¡®çæ¨¡æ¿è·¯å¾ï¼ä¸éè¦å¨é¡¹ç®é ç½®æä»¶setting.pyä¸è¿è¡URLçé ç½®ã
ï¼2ï¼æ¨¡æ¿ç®å½ä¸åæä¸ä¸ªåç®å½ï¼è¿ä¸ªåç®å½çåç§°åappçåç§°ä¸è´ã
ï¼3ï¼æ¨¡æ¿ç®å½ä¸æä¸ä¸ªbase.htmlï¼è¿æ¯æææ¨¡æ¿ä¸çå ¬å ±æ¨¡æ¿ï¼å¨Djangoçæ¨¡æ¿æä»¶ä¸ï¼å¯ä»¥æç±»ä¼¼äºâç»§æ¿âçåè½ã
å ¬å ±æ¨¡æ¿æä»¶base.htmlç¼è¾å¦ä¸
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equiv="X-UA-COMPATIBLE" content="IE=Edge"> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" href="http://necolas.github.io/normalize.css"> <link rel="stylesheet" href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css"> </head> <body> <div> {% block content %} {% endblock %} </div> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js></script> <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script> </body> </html> |
é¤äºä¸äºHTMLçæ ç¾ï¼é颿ä¸ä¸ªç¹æ®çâåâæ ç¾ï¼{% block name %}
å¼å§æ ç¾ï¼{% block name %} åçå 容 ç»ææ ç¾ï¼{% endblock %} |
䏿 é¢å表对åºçæ¨¡æ¿æä»¶ï¼blog/templates/blog/titles.html
å 容ç¼è¾å¦ä¸
{% extends "base.html" %} {% block title %}blog titles{% endblock %} {% block content %} <div class="row text-center vertical-middle-sm"> <h1>æçå客</h1> </div> <div class="row"> <div class="col-xs-12 col-md-8"> <ul> {% for blog in blogs %} <li>{{ blog.title }</li> {% endfor %} </ul> </div> <div class="col-xs-6 col-md-4"> <h2>广å</h2> <p>Dangoç½åï¼www.itdiffer.com</p> </div> </div> {% endblock %} |
说æ
1ï¼{% extends "base.html" %}表示该模æ¿ç»§æ¿äºåºç¡æ¨¡æ¿base.htmlï¼å®å¯ä»¥å¯¹åºç¡æ¨¡æ¿è¿è¡æ©å±ï¼æ¥ä¸æ¥ç代ç 齿¯åºäºbase.htmlçï¼å¯å¯¹å ¶ä¸çé¨åå 容鿰å®ç°ã
2ï¼å¨è¯¥æ¨¡æ¿æä»¶ä¸ï¼å¯¹âç¶æ¨¡æ¿âéé¢ç两个å{%block title%}å{%block content%}è¿è¡éåã
3ï¼å¨è¯¥æ¨¡æ¿ä¸ï¼å¾ªç¯ååºä»è§å¾å½æ°ä¼ è¿æ¥çææè®°å½ï¼ä¸æ¡è®°å½å°±æ¯ä¸ä¸ªå¯¹è±¡ï¼
{% for blog in blogs %} <li>{{ blog.title }</li> {% endfor %}
|
4ï¼ä½¿ç¨åå±è±æ¬å·å¼ç¨åéã
{{ blog.id }} {{ blog.title }} |
3. é ç½®URL
åç«¯è®¿é®æå¡å¨ä¸çèµæºï¼éè¦æç¡®æåºè®¿é®åªä¸ä¸ªèµæºï¼éè¦é ç½®URLãDjangoæ¡æ¶ä¸éè¦é 置两次URLï¼å¨é¡¹ç®çé ç½®ä¸å é ç½®åºç¨çURLï¼åé ç½®åºç¨éé¢çå ·ä½çURLã
å端访é®åå°URLç顺åºï¼å 访é®å°é¡¹ç®çURLï¼ç¶åè¯·æ±æä¼è¢«è½¬åå ·ä½æä¸ªåºç¨ä¸çURLã
ï¼1ï¼é ç½®å½å项ç®çURL
æä»¶ï¼åè½ç®¡çç®å½(ä½äºæ ¹ç®å½ä¸ä¸åç§°ä¸é¡¹ç®ç¸å)ä¸çurls.py
django_site/django_site/urls.py
æ°å¢ä»£ç
url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')) |
å¦å¾
卿µè§å¨ä¸è¾å ¥å°åï¼http://server_ip:端å£å·/blog ï¼éè¿è¿éçURLé ç½®ï¼è¯¥è¯·æ±ä¼è¢«è½¬åå°blogè¿ä¸ªåºç¨éé¢çURLã
ï¼2ï¼é ç½®appçURL
å¨appç®å½æä»¶urls.pyï¼å 容ç¼è¾å¦ä¸
from django.conf.urls import url from . import views
urlpatterns = [ url(r"^$", views.blog_title, name="blog_title"), ] |
å¦å¾
views.blog_title声æäºååºè¿ä¸ªè¯·æ±[http://server_ip:端å£å·/blog]ç彿°ã
blog_title彿°å¦ä½å¤ç该请æ±ï¼çï¼è¿å模æ¿ï¼æ¾ç¤ºå¨å端ç½é¡µä¸
卿件views.pyä¸ï¼å½æ°blog_titleå®ç°å¦ä¸å¾
4. æµè¯
è¿è¡æå¡å¨
卿µè§å¨ä¸è®¿é®ï¼å°åæ è¾å ¥ï¼http://192.168.49.128:8000/blog/
ä¸ãæ¾ç¤ºæç« å 容
1. æç« æ é¢è¶ 龿¥
æè·¯ï¼ç¨æ·å廿 é¢ä¹åï¼æ¾ç¤ºæç« å 容ãæä»¥ï¼é¦å è¦å¯¹æç« æ é¢åè¶ é¾æ¥ãä¿®æ¹æä»¶title.htmlä¸è¿é¨å代ç ï¼
æä»¶ï¼django_site/blog/templates/blog/titles.html
<ul> {% for blog in blogs %} <li>{{ blog.title }</li> {% endfor %} </ul>
æ¹ä¸º
<ul> {% for blog in blogs %} <li><a href="{{ blog.id }}">{{ blog.title }}</a></li> {% endfor %} </ul> |
注ï¼
1ï¼è¶ ææ¬é¾æ¥çæ ¼å¼ <a href = "â¦"> æ è®°è¶ ææ¬é¾æ¥ä¿¡æ¯ </a>
2ï¼å±æ§hrefï¼äºæå®è¶ ææ¬é¾æ¥çç®æ ã
ä¾å¦
test.html
<!DOCTYPE html> <html> <head> <title>æµè¯è¶ 龿¥</title> </head> <body> <div> <a href="http://www.baidu.com">ç¾åº¦ä¸ä¸</a> </div> </body> </html> |
æµè§å¨æå¼htmlæä»¶ï¼åå»âç¾åº¦ä¸ä¸âï¼å°±å¯ä»¥è·³å°ç¾åº¦æç´¢å¼æé¦é¡µã
æç« æ é¢é½æè¶ 龿¥ä¹åï¼é¢è²ä¹åçäºååï¼å¦ä¸å¾ï¼
2. æç¡®å端ç½é¡µè¯·æ±çURL
æµç¨ï¼è¯·æ±çURLæç»æ¯ä¼è¢«è½¬åå°è§å¾å½æ°ä¸å¤çï¼è§å¾å½æ°è§£æè¯·æ±çURLåæ°ï¼ååæå®ç模æ¿ä¸ä¼ éæ°æ®ï¼å¹¶è¿å渲æçç»ææ¨¡æ¿ï¼htmlï¼å°å端æ¾ç¤ºã
æç« æ é¢çè¶ ææ¬è¿æ¥ç®æ æ¯å客æç« çidï¼å廿æ¬çæ¶åï¼æµè§å¨è§£æå°çURLå°ååºè¯¥æ¯ï¼
http://192.168.49.128:8000/blog/1 http://192.168.49.128:8000/blog/2 http://192.168.49.128:8000/blog/3
|
å¦ä¸å¾
æä»¥ï¼è§å¾å½æ°åºè¯¥æ¯è¦æ ¹æ®è§£æå°ä¸åçURLä¿¡æ¯ï¼å模æ¿ä¸ä¼ å ¥ä¸åçæ°æ®ï¼å¹¶è¿åå°å端æ¾ç¤ºã
3. 仿°æ®åºä¸è¯»åæç« å 容
çéè®°å½çæ¡ä»¶æ¯æç« çidå·
æ¹å¼1ï¼SQLè¯å¥
使ç¨SELECTæ¥è¯¢è¯å¥å°±å¯ä»¥å®ç°ï¼å½ä»¤ï¼
SELECT * FROM blog_blogarticles WHERE id=1
SELECT * FROM blog_blogarticles WHERE id=2
SELECT * FROM blog_blogarticles WHERE id=3 |
å¦ä¸å¾
æ¹å¼2ï¼DjangoçAPI
å¦ä¸å¾
4. ç¼åè§å¾å½æ°
æ°å¢ä¸ä¸ªå½æ°blog_article()ï¼è¯¥å½æ°å®ç°ï¼å客æç« å 容ç读å + ååºè¯·æ±ï¼è§£æç¨æ·è¯·æ±çURLï¼ææ°æ®æ¸²æå°æå®ç模æ¿ä¸ï¼å¹¶è¿åç»ææ¨¡æ¿å°å端æ¾ç¤ºï¼
appç®å½ä¸çè§å¾æä»¶ï¼django_site/blog/view.pyï¼æ°å¢ä¸ä¸ªblog_article()彿°ã
from django.shortcuts import render from .models import BlogArticles
# Create your views here. # Deal with blog titles def blog_title(request): blogs = BlogArticles.objects.all() return render(request, "blog/titles.html", {"blogs":blogs})
#Deal with blog article def blog_article(request, article_id): article = BlogArticles.objects.get(id=article_id) pub = article.publish return render(request, "blog/content.html", {"article":article, "publish":pub})
|
å¦å¾
ç¸å¯¹å¤çæç« æ 颿¥è¯´ï¼å¤çå 容ç彿°å¤äºä¸ä¸ªåæ°idï¼åé¢éè¦é ç½®URLï¼å°è¿ä¸ªidä¼ å ¥è§å¾å½æ°ä¸ã
render()彿°ç第äºä¸ªåæ°æ¯æ¨¡æ¿ï¼ç®åæ¨¡æ¿æä»¶è¿ä¸åå¨ï¼æ¥ä¸æ¥å°±è¦å»åå»ºæ¨¡æ¿æä»¶ï¼åæ°3æå®äºè§å¾å½æ°ä¼ å ¥æ¨¡æ¿ä¸çæ°æ®å 容ã
5. æ°å»ºæ¨¡æ¿
æ°å»ºæä»¶content.htmlï¼ä½ç½®ï¼/templates/blog/content.html
ç¼è¾å 容å¦ä¸
{% extends "base.html" %} {% block title %}blog article{% endblock %} {% block content %} <div class="row text-center vertical-middle-sm"> <h1>{{ article.title }}</h1> </div> <div class="row"> <div class="col-xs-12 col-md-8"> <p class="text-center"><span>{{ article.author.username }}</span><span style="margin-left: 20px">{{ publish }}</span></p> <div>{{ article.body }}</div> </div> <div class="col-xs-6 col-md-4"> <h2>广å</h2> <p>djangoå®ç½ï¼https://docs.djangoproject.com/zh-hans/2.2/</p> </div> </div> {% endblock %} |
6. é ç½®URL
对äºåä¸ä¸ªAPPï¼ä¸éè¦å次å»ä¿®æ¹åè½ç®¡çç®å½ä¸çURLé ç½®æä»¶ï¼django_site/django_site/urls.py
é ç½®APPçURLå³å¯ï¼æä»¶ï¼django_site/blog/urls.py
æ°å¢ä¸è¡ä»£ç ï¼å¦ä¸ï¼
from django.conf.urls import url from . import views
urlpatterns = [ url(r"^$", views.blog_title, name="blog_title"), url(r'(?P<article_id>\d)/$', views.blog_article, name="blog_article"), ] |
å¦å¾
æ³¨ï¼æ£å表达å¼r'(?P<article_id>\d)/$'è·å¾è¯·æ±çè¶ ææ¬è¿æ¥ç®æ ï¼1 ã2ã 3ï¼ï¼å³å客æç« çidï¼ç¶åå°idèµå¼ç»article_idï¼åæ°ä¼ å ¥è§å¾å½æ°blog_article()ã
7. æµè¯
å¯å¨æå¡å¨
å 访é®å客主页
å廿 é¢ï¼å³å¯è¿æ¥å°å客å 容页é¢ã
说æè§å¾å½æ°è½æ£ç¡®è§£æå°URLï¼å¹¶å°ç»æè¿åå°å端ã
8. å¤çå¼å¸¸è¯·æ±
8.1 get_object_or_404()æ¹æ³
ååï¼get_object_or_404(klass, *args, **kwargs)
åæ°è§£é
klassï¼æ°æ®æ¨¡åä¸çæä¸ªç±»
*argså**kwargsï¼æ¥è¯¢çæ¡ä»¶åæ° |
ä½¿ç¨æ¶ï¼è¦å å¯¼åºæ¨¡åï¼
from django.shortcuts import render, get_object_or_404 |
å½è¯·æ±ç对象ä¸å卿¶ï¼è¯¥æ¹æ³å°±ä¼æåºDoesNotExitå¼å¸¸ãå³URLå°åä¸åæ³æ¶ï¼ç½é¡µæç¤º404é误ã
ä¿®æ¹APPçè§å¾å½æ°ï¼æä»¶ï¼django_site/blog/view.py
å¦ä¸å¾
å设æµè§å¨ä¸å°åæ è¾å ¥ï¼http://192.168.49.128:8000/blog/8
ç»æå¦ä¸å¾