心得:马上快要过年了,好像没有一丝丝开心的意思,反而又长了一岁,不是不想回家,看着大伙该结婚的结婚,该生孩子的生孩子,压力莫名的涌上心头,不得不珍惜对我来说的每一分每一秒。上次学了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)
- route 参数 url 的匹配规则。这个参数中可以指定 url 中需要传递的参数,比如在访问文 章详情页的时候,可以传递一个 id 。传递参数是通过 <> 尖括号来进行指定的。比如文章的 id 都是 int 类型,那么可以这样 写 <int:id>.
- view 参数:可以为一个视图函数或者是 类视图.as_view() 或者是 django.urls.include() 函 数的返回值
- 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>
- 在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设置
- 基础路径:
BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
项目的基础路径,动态变化的路径,一直到项目这一根路径下
-
配置服务器IP
ALLOWED_HOSTS = []
如果不设置默认服务器的ip是127.0.0.1,如果要将此台电脑设置为服务器,
并且其他人可以同时连接需要将自己的ip加入。同时运行项目时增加参数,端口号任意
python manage.py runserver 0.0.0.0:9000 -
注册app
INSTALLED_APPS
将创建的app加入installed_apps里,才能完成注册 -
模板配置
TEMPLATES
'DIRS': [],
定义规则 [os.path.join(BASE_DIR, ‘templates’)]
'APP_DIRS': True,
查询规则:先找有无定义DIRS下的路径,如果没有并且APP_DIRS为True,就会去各个app下去找对应的模板文件
使用第二种的话就要在app路径下创建模板路径:front/templates/front/index.html
DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#数据库引擎
'NAME': 'db_django',
#数据库名称
'USER':'root',
#登录用户名
'PASSWORD':'root',
#登录密码
'HOST':'127.0.0.1',
#登录数据库ip
'PORT':'8086',
#登录数据库端口号
}
}
TIME_ZONE
修改时区
TIME_ZONE = 'Asia/Shanghai'
LANGUAGE_CODE
修改语言
LANGUAGE_CODE = 'zh-hans'
- 静态文件路径设置
如果有一些静态文件是不和任何 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):