第四十六篇 DjangoURL映射和视图,以及基本配置

心得:马上快要过年了,好像没有一丝丝开心的意思,反而又长了一岁,不是不想回家,看着大伙该结婚的结婚,该生孩子的生孩子,压力莫名的涌上心头,不得不珍惜对我来说的每一分每一秒。上次学了Django之后,发现自己对数据库并不熟悉,所以整体完整的学了Mysql数据库的原生操作。虽然Django有自己的对数据库控制的方法,但其框架是始终基于数据库的,所以继续加油。

这一篇主要写写路由,视图,模板的相关配置:
在这里插入图片描述

URL映射:

在这里插入图片描述
主urls.py

在之后的项目中,会存在多个app,当然url必须在当前的app下做映射,所以我们要在主url下注册子url的存在。

from django.urls import path,include

urlpatterns = [
    path('',include('front.urls',namespace='front')),
]

注册时主要使用path和includ函数

子urls.py

from django.urls import path,re_path
from . import views

#应用命名空间
app_name = 'front'

urlpatterns = [
    path('',views.index,name='index'),
    path('book/author/',views.author,name='author'),
    path('book/<name>/',views.book,name='book'),
    re_path('book/(?P<book_id>\d{4})/$',views.book_id,name='book_id'),
]

path函数:
path(route,view,name=None,kwargs=None)

  1. route 参数 url 的匹配规则。这个参数中可以指定 url 中需要传递的参数,比如在访问文 章详情页的时候,可以传递一个 id 。传递参数是通过 <> 尖括号来进行指定的。比如文章的 id 都是 int 类型,那么可以这样 写 <int:id>.
  2. view 参数:可以为一个视图函数或者是 类视图.as_view() 或者是 django.urls.include() 函 数的返回值
  3. name 参数:这个参数是给这个 url 取个名字的,这在项目比较大, url 比较多的时候用处 很大。可以在views中和前端使用名称进行反转获取url。

re_path函数:
re_path 的参数和 path 参数一模一样,只不过第一个参数也就 是 route 参数可以为一个正则表达式。 所有的 route 字符串前面都加了一个 r ,表示这个字符串是一个原生 字符串。

正则规则必须是(?P)

re_path(r'articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archiv e),

include函数:
在项目变大以后,经常不会把所有的 url 匹配规则都放在项目的 urls.py 文件中,而是每 个 app 都有自己的 urls.py 文件,在这个文件中存储的都是当前这个 app 的所有 url 匹配规 则。然后再统一注册到项目的 urls.py 文件中。
include(pattern,namespace=None)

 path('movie/',include('movie.urls',namespace='movie'))

注册之后要在对应的app urls.py下声明命名空间
app_name=‘movie’

URL分发器

views.py

直接在网页返回内容

path('book/author/',views.author,name='author'),
from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
    return HttpResponse("这是首页的内容")

在这里插入图片描述通过?=hello来获得

path('book/<name>/',views.book,name='book'),
def author(request):
    author = request.GET.get('author')
    text = "你输入的书籍作者是%s"%author
    return HttpResponse(text)

在这里插入图片描述
通过url定义的参数直接获取

path('book/<name>/',views.book,name='book'),
def book(request,name):
    text = "你书籍名称是%s"%name
    return HttpResponse(text)

在这里插入图片描述
通过正则匹配得到

re_path('book/(?P<book_id>\d{4})/$',views.book_id,name='book_id'),
def book_id(request,book_id):
    text = "你书籍的编号是%s"%book_id
    return HttpResponse(text)

在这里插入图片描述
通过反转获取url地址

path('book_url/',views.get_url),
def get_url(request):
    url=reverse('front:index')
    return HttpResponse("拿到的书的id的url是%s"%url)

在这里插入图片描述

当路由含有参数时进入网站的几种方法:

1.直接手动在url中输入,网页会收到参数并返回到界面:

#url
urlpatterns = [
    path('index/<book>/', views.index,name="book"),
]

#views.py
def index(request,book):
    return render(request,'front/index.html',context={'book':book})

#html
<h2>我读的这本书叫做{{ book }}</h2>
  1. 在a标签中指定参数直接跳转:
#url
urlpatterns = [
    path('index/<book>/', views.index,name="book"),
    path('index/', views.first),
]

view
def index(request,book):
    return render(request,'front/index.html',context={'book':book})

def first(request):
    return render(request,'front/first.html')

#first.html
<div><a href="{% url 'book' book="三国演义" %}">点我</a></div>

#index.html
<h2>我读的这本书叫做{{ book }}</h2>

3.在views.py reverse中使用参数,然后用redirect ,在first网页输入内容将参数提交到另外一个网页

#url
urlpatterns = [
    path('index/<book>/', views.index,name="book"),
    path('index/', views.first),
]

#view
from django.shortcuts import render ,reverse,HttpResponse,redirect
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
def index(request,book):
    return render(request,'front/index.html',context={'book':book})
@csrf_exempt
def first(request):
    if request.method=="GET":
        return render(request,'front/first.html')
    else:
        book=request.POST.get('book')
        return redirect(reverse('book',kwargs={'book':book}))

#first.html
<div>
    <form action="" method="post">
        {% csrf_token %}
        <label for="book_name">书籍名称</label>
        <input type="text" name="book">
        <input type="submit">
    </form>
</div>

#index.html
<h2>我读的这本书叫做{{ book }}</h2>

结果:
在这里插入图片描述
在这里插入图片描述

settings.py设置

  1. 基础路径:BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

项目的基础路径,动态变化的路径,一直到项目这一根路径下

  1. 配置服务器IP ALLOWED_HOSTS = []
    如果不设置默认服务器的ip是127.0.0.1,如果要将此台电脑设置为服务器,
    并且其他人可以同时连接需要将自己的ip加入。同时运行项目时增加参数,端口号任意
    python manage.py runserver 0.0.0.0:9000

  2. 注册app INSTALLED_APPS
    将创建的app加入installed_apps里,才能完成注册

  3. 模板配置TEMPLATES

'DIRS': [],

定义规则 [os.path.join(BASE_DIR, ‘templates’)]

'APP_DIRS': True,

查询规则:先找有无定义DIRS下的路径,如果没有并且APP_DIRS为True,就会去各个app下去找对应的模板文件
使用第二种的话就要在app路径下创建模板路径:front/templates/front/index.html

  1. DATABASES
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        #数据库引擎
        'NAME': 'db_django',
        #数据库名称
        'USER':'root',
        #登录用户名
        'PASSWORD':'root',
        #登录密码
        'HOST':'127.0.0.1',
        #登录数据库ip
        'PORT':'8086',
        #登录数据库端口号

    }
}
  1. TIME_ZONE 修改时区
TIME_ZONE = 'Asia/Shanghai'
  1. LANGUAGE_CODE 修改语言
LANGUAGE_CODE = 'zh-hans'
  1. 静态文件路径设置
    如果有一些静态文件是不和任何 app 挂钩的。那么可以在 settings.py 中添 加 STATICFILES_DIRS ,以后 DTL 就会在这个列表的路径中查找静态文件。比如可以设置为:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,"static")
]

9.csrf机制
当我们需要提交数据时,网页会有一个安全检测就是csrf机制,我们需要在程序中加入csrf安全方法才可以提交数据。

html表单中输入{% csrf_token %}

<div>
    <form action="" method="post">
        {% csrf_token %}
        <label for="book_name">书籍名称</label>
        <input type="text" name="book">
        <input type="submit">
    </form>
</div>

views.py中使用装饰器

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def first(request):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值