Python学习之路—2018/6/18
1.PyCharm简单Django示例
创建django
File>New Project>Django,创建完毕后如下图所示:
启动Django
在pycharm右上角的manage中点击edit configurations编辑配置参数
在Parameters中输入runserver 127.0.0.1:8080即可
2.静态文件配置
- 新建一个static文件夹
- 将js、css等前端需要用到的文件放入static文件夹
- 配置setting.py,将static文件夹路径加入STATICFILES_DIRS中
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login),
path('timer/', views.timer),
]
view.py
def timer(request):
ctime = time.strftime("%Y-%m-%d %X", time.localtime())
return render(request, "timer.html", {"time": ctime})
'''
"timer.html":渲染的html文件
{"time": ctime}:将ctime传入到html文件中,html文件课题通过{{time}}获取ctime
'''
timer.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2 id="timer">{{ time }}</h2>
</body>
<script src="/static/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$("#timer").click(function () {
$(this).css("color", "red")
})
</script>
</html>
3.Django路由层
简单的路由配置
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^gyq/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.gyq), # views.gyq(2018, 6, 18) 当需要传入参数时需要在其左右加一对()
]
有名分组
urlpatterns = [
re_path(r'^gyq/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$', views.gyq) # views.gyq(year="2018", month="6", day="18")
]
通过(?P<name>pattern)
传入位置参数,其中name是分组名称,pattern是正则匹配模式
分发
在app01文件夹中新建一个urls.py,将有关app01的局部路由配置写入其中,把全局的路由配置写入项目同名文件夹的ulrs.py中
app01/urls.py
from django.urls import path, re_path
from app01 import views
urlpatterns = [
re_path(r'^gyq/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.gyq), # views.gyq(2018, 6, 18)
]
first_pro/urls.py
from django.urls import path, re_path, include
from app01 import views, urls
urlpatterns = [
re_path(r'^', include(urls))
]
反向解析
urls.py
urlpatterns = [
path('login/', views.login, name="Login"),
]
在模板中
当return render时,首先会解析html中的代码,当遇到{{}}或者{%%}时会反向解析,接着将渲染结果反馈给浏览器
<form action="{% url 'Login' %}" method="post"> {#寻找name="Login"url并反馈给浏览器#}
用户名:<input type="text" name="username"><br>
密   码:<input type="password" name="password"><br>
<input type="submit">
</form>
在Python中
主要通过reverse(name),其中name是url的命名
urls.py
urlpatterns = [
re_path(r'^gyq/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.gyq, name="year-month-day")
]
view.py
from django.urls import reverse
def gyq(request, year, month, day):
url = reverse("year-month-day", args=(2018, 11, 25)) # 此时的参数只是正则匹配中的参数,与在浏览器输入的无关
print(url)
return HttpResponse(year + "-" + month + "-" + day)
名称空间
由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回。当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
project中的urls.py
urlpatterns = [
re_path(r'^app01/', include(("app01.urls", "app01"))), # 参数1:app对应的urls
re_path(r'^app02/', include(("app02.urls", "app02"))), # 参数2:名称空间的命名
]
app01和app02中的urls.py
urlpatterns = [
re_path(r'index/', views.index, name="index"),
]
app01/views.py
def index(request):
return HttpResponse(reverse("app01:index"))
app02/views.py
def index(request):
return HttpResponse(reverse("app02:index"))
Django2.0中的path
re_path()中匹配的正则表达式修改起来较为麻烦,所以在2.0中引入了path模块解决这个问题
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('gyq/<int:year>/', views.get_year),
]
使用(<>)从url中捕获值,下面官方文档的简单示例:
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
Path Converters
- str:匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
- int:匹配正整数,包含0。
- slug:匹配字母、数字以及横杠、下划线组成的字符串。
- uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
- path:匹配任何非空字符串,包含了路径分隔符