Python学习之路—2018/6/18

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中

扫描二维码关注公众号,回复: 1629205 查看本文章

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>&nbsp&nbsp&nbsp码:<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:匹配任何非空字符串,包含了路径分隔符

猜你喜欢

转载自www.cnblogs.com/ExBurner/p/9196686.html
今日推荐