Appearance
Django
安装
pip install django
验证是否安装成功
cmd控制台,python进入交互模式,输入下面这两行
import django django.version
生成项目
方法一:
django-admin[.py] startproject my_project
方阔号里的可写可不写。my_project是项目名称,可改成自己的项目名
方法二:
pycharm创建
指定IP及端口号
方法一:
python manage.py runserver 0.0.0.0:9527
方法二:
pycharm中设置启动器
创建模块
方法一:
python manage.py startapp hello
hello是模块名
方法二:
pycharm创建
返回视图
在创建的hello模块中找到views.py这个文件,创建响应函数
py
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("hello")然后在项目主目录中找到urls.py,添加路径。此时的代码应如下所示:
py
from django.contrib import admin
from django.urls import path
# 引入视图
from hello.views import hello_world
urlpatterns = [
path('admin/', admin.site.urls),
# 添加下面这行
path('hello/', hello_world),
]当我们访问hello地址时就会看到页面中的返回值
其中,path可以有三个参数:url值,返回的视图函数,匹配规则的名称。所以可有:
path('hello/<int>', hello_world, name='helloworld')
目录查找顺序
查找模板文件,会先从项目的主目录下的templates里查找(这需要settings.py里的TEMPLATES配置),然后从INSTALLED_APPS里依次查找(即从app模板目录列表中查找)
分模块管理路由
前面我们将path写入主项目里的urls.py文件中。但是当项目变大,路由变多,这样就不便于管理。我们希望能够每个模块维护自己的路由。
首先,在我们创建的hello模块中新建urls.py文件,里面的内容如下所示:
py
from django.urls import path
from hello.views import hello_world, hello_news
urlpatterns = [
path('world/', hello_world),
path('news/', hello_news),
]可以看到我们在这里引入了两个视图函数,也就是views.py里有两个函数。views.py里的代码如下:
py
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("world")
def hello_news(request):
return HttpResponse("news")然后我们需要在主urls.py中引入这个路由
py
from django.contrib import admin
# 注意下面这行里的include
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 用include将urls引入
path('hello/', include('hello.urls')),
]反向寻找地址
一般我们输入网址获取视图,但也可以在视图函数中通过解析规则的名称,反向获取到地址。我们在views.py中写入:
py
from django.http import HttpResponse
# 引入
from django.urls import reverse
# Create your views here.
def hello_world(request):
# 使用reverse
print(reverse('hello_world'))
return HttpResponse("world")在模块的urls.py中我们要为路由解析规则命名
py
# 其他内容省略
path('world/', hello_world, name='hello_world'),这样,当我们访问hello/world/这个地址的时候就能够在控制台获取到地址
动态地址
如果想访问动态地址,我们需要在视图中传入第二个参数
py
def hello_news(request, id):
return HttpResponse("news", id)同时,访问规则里也要写好匹配规则
py
# 其他内容省略
# 注意下面int后面的id是与视图中的参数名对应的
# 写了参数,则必须有参数,否则找不到页面
path('news/<int:id>', hello_news, name='hello_news'),正则方式匹配规则
py
# 引入
from django.urls import re_path
re_path(r'^news/[<id>/]')地址参数
地址参数,即平时地址?后面的那些值。可以用视图中的request获取。
py
def search(request):
name = request.GET.get('name', None)解决跨域
- 安装第三方扩展
pip install django-cors-headers
- 配置
在settings.py中
py
INSTALLED_APPS = ['corsheaders',]- 配置中间件
py
MIDDLEWARE=[
'django.contrib.sessions.middleware.SessionMiddleware',
# 在这里新增中间件
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
]- 添加白名单
py
CORS_ORIGIN_WHITELIST = (
# 地址根据实际情况来填写即可
'http://127.0.0.1:8080',
'http://localhost:8080',
)- 可选配置
py
# 允许的请求头
CORS_ALLOW_HEADERS = ('source', 'icode')
# 允许携带cookie
CORS_ALLOW_CREDENTIALS = Truerequest里的API
我们在前面写了很多次request参数。实际应用中,我们能够使用request下的方法获取请求信息等内容。
request.method 请求方式 request.META 请求头信息
这个META里包含很多内容,以json格式返回。其中,REMOTE_ADDR可以获取到IP地址,HTTP_USER_AGENT可以获取设备信息。还有其他信息不一一列举。
request.headers 精简的请求头信息
响应对象
在前面我们有写过如下代码:
py
def hello_news(request, id):
return HttpResponse("news", id)其中的HttpResponse就是一个响应对象。其实还有其他的。
- HttpResponseRedirect 重定向
- JsonResponse 响应Json
- FileResponse 响应文件
响应对象的关系如下:
JsonResponse的父级是HttpResponse
FileResponse的父级是StreamingHttpResponse
HttpResponse和StreamingHttpResponse的共同父级是HttpResponseBase
HttpResponse
- status 设置HTTP响应状态码
- status_code 查看HTTP响应状态码
- content_type 设置响应的类型
- write() 写入响应内容
py
def req(request):
# 会把响应状态码改为201
return HttpResponse("news", status=201)如果单独赋值成一个变量,也可以通过变量去修改状态码
py
def req(request):
resp = HttpResponse("news", status=201)
# 会把状态码改成204
resp.status_code = 204
return resp上面提到了响应类型。常见的响应类型有:
- text/html 超文本标记语言文本(HTML)
- text/plain 普通文本
- text/xml XML文档
- image/png、image/jpeg、image/git 图片或图形
- application/json json数据类型
JsonResponse
返回json格式的响应
py
from django.http import JsonResponse
def req(request):
response = JsonResponse({
'username': 'admin',
'passwd': '123456',
})
return responseFileResponse
py
from django.http import FileResponse
# 省略函数定义及返回
response = FileResponse(open('file.txt', 'rb'))重定向
两种方式:
- HttpResponseRedirect
- redirect()快捷方式
在urls.py中配置好匹配规则
py
from django.urls import path
from hello.views import test, page404
urlpatterns = [
path('test/<int:id>', test, name='test'),
path('404/', page404, name='notfound')
]在views.py视图文件中写好响应函数
py
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
def test(request, id):
if id < 1000:
return redirect(reverse('notfound'))
return render(request, 'test.html')
def page404(request):
return HttpResponse("404")代码的意思是:访问test/id,当id这个地方的数值小于1000的时候重定向到404页面
重写内置错误视图
django内置了一些错误反馈页面。如果我们想使用自制的页面替换,需要在urls.py中配置
- handler500 = "myproj.views.page_500"
类似的,可以有404等其他错误相关的配置。
切记,要切换到生产模式。即在settings.py中将DEBUG改为False
另外,如果要处理404页面,需要额外传request和exception参数
在项目的urls.py中新建变量
py
# 注意下面的myproj,应以项目名称填入
handler500 = 'myproj.views.page_500'在项目目录中新建views.py,里面写入视图函数
py
def page_500(request):
# 实际项目中应返回自制页面
return HttpResponse("500")处理静态文件
static.serve
在项目的settings.py中添加配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'medias')
这里的media路径请根据实际情况填写。
settings里配置完毕,在urls.py中也要添加配置
py
from django.views.static import serve
from django.urls import re_path
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve,{
'document_root': settings.MEDIA_ROOT,
}),
]内置通用视图
为了简化开发流程,django内置了一些视图处理。以TemplateView为例
- 继承视图(django.views.generic.TemplateView)
- 配置模板地址
- 配置URL
我们在views.py中写上:
py
from django.views.generic import TemplateView
class HomeView(TemplateView):
template_name = 'home.html'在urls.py中(任意,注意访问路径)写入:
py
# 记得导入HomeView
# 其他省略。注意下面的函数引用
path('home/', HomeView.as_view(), name='home'),还有其他的内置通用视图,如:
- django.views.generic.ListView 列表类数据的封装,支持分页
- django.views.generic.DetailView 详情类数据的封装