Django 系列博客二

<h1 id="django-系列博客二">Django 系列博客(二)
<h2 id="前言">前言

今天博客的内容为使用 Django 完成第一个 Django 页面,并进行一些简单页面的搭建和转跳。

在上一篇博客中已经安装好了虚拟环境,所以用虚拟环境来安装指定版本的 Django。为了可以从头到尾的走一遍流程,我重新创建了一个虚拟环境。

  1. 首先进入虚拟环境路径下的 bin 目录
  2. 使用命令激活虚拟环境

  1. 安装指定版本 Django

首先使用 pip3 list 命令查看

可以看到都是创建虚拟环境时安装的依赖包,现在使用 pip 命令安装指定 django 版本,因为做项目需要稳定,所以安装的版本不是最新的。

可以看到新安装了2个包,pytz 是 python time zone 的缩写,是用来转换时区的包。

前往目标路径创建项目,在这里我的 django 项目都在我的家目录下面的 django_project里面。

进入要创建项目的路径下,使用下面的命令创建一个 django 项目。

django-admin startproject project_name

可以看到多了个文件夹。查看项目结构

进入项目根目录使用下面命令创建一个 app。

python3 manage.py startapp app_name

创建成功并查看项目结构。

使用下面命令

python3 manage.py runserver 127.0.0.1:8888

成功后会在本机上的8888端口开启 django 服务

访问8888端口会显示下图页面

好了,到现在你已经开启了第一个 django 服务,并且还是使用了命令行。

其实会使用命令行创建项目那么使用 pycharm 应该是手到擒来,毕竟 pycharm 已经做了很多工作了。不过也有点麻烦。。。

项目目录:包含项目最基本的一些配置
    -- __init__.py:模块的配置文件,将blog_proj文件夹变成了模块
    -- settings.py:配置总文件
    -- urls.py:url配置文件,django项目中的所有页面都需要对其配置url地址
    -- wsgi.py:(web server gateway interface),服务器网关接口,python应用与web服务器直接通信的接口
templates:模板文件夹,存放html文件的(页面),支持使用Django模板语言(DTL),也可以使用第三方(jinja2)
manage.py:项目管理器,与项目交互的命令行工具集的入口,查看支持的所有命令python3 manage.py

import os
# 项目根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

项目安全码

SECRET_KEY = 'guwba1u$18=&*8kf44_u&swqb@xlwgel7n$0rs=(+f10yvz)p0'

调试模式,上线项目要关闭debug模式,不然后台出现异常会直接抛给前台展现给用户看了

DEBUG = True

在上线项目中,规定只能以什么ip地址来访问django项目

DEBUG = FALSE

ALLOWED_HOSTS = ['localhost']

ALLOWED_HOSTS = []

项目自带的应用

我们创建了自己的应用就要将自定义应用添加到该配置

INSTALLED_APPS = [
'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',]

中间件

django自带的工具集

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',]

配置url配件文件的根文件,执行urls.py

ROOT_URLCONF = '项目目录.urls'

模板,一个个html文件

TEMPLATES = [
{

如果使用第三方,可以在这个地方修改模板引擎

    'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS': True,'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},]

服务器网关接口应用

WSGI_APPLICATION = '项目目录.wsgi.application'

数据库配置

要配置自定义数据库去下面链接去查询详细配置

https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR,'db.sqlite3'),}
}

密码认证配置

https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',]

国际化相关配置

https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

静态文件地址 (CSS,JavaScript,Images)

https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'


<h3 id="创建项目应用">创建项目应用

使用 pycharm 自带的命令行工具来创建应用

应用创建完后将应用名添加到 settings.py文件中

INSTALLED_APPS = [
    'django.contrib.admin',...
    'django.contrib.staticfiles',# 添加的自定义应用
    'app',]

创建后的 app 目录结构和使用命令行创建的一样,下面来看看具体都有什么作用

migrations:数据迁移(移植)模块,内容都是由Django自动生成
    -- __init__.py
__init__.py
admin.py:应用的后台管理系统配置
apps.py:django 1.9后,本应用的相关配置
models.py:数据模型模块,使用ORM框架,类似于MVC模式下的Model层
tests.py:自动化测试模块,可以写自动化测试脚本
views.py:执行相应的逻辑代码模块(相应什么,如何相应),代码逻辑处理的主要地点,项目的大部分代码所在位置

通过配置路由和视图文件来响应第一次连接请求。

from django.conf.urls import url
from django.contrib import admin

导入应用视图

import app.views as app_view # 取别名

配置路由

urlpatterns = [
url(r'^admin/',admin.site.urls),# 为指定函数配置 url
url(r'^index/&',app_view.index)
]


<h4 id="配置视图">配置视图


<pre class="python"># 导入处理请求的 http 相应功能
from django.http import HttpResponse

django中每一个请求都会设置相应函数来进行处理

函数的参数约定为 request

def index(request):
return HttpResponse('index page!')

<h4 id="启动服务">启动服务

启动服务后访问 localhost:8000/index/,可以看到响应为 index 函数里填写的响应,说明服务成功启动并且响应了自己想要的响应字符串。

项目目录下有个 templates 文件夹是专门用于存放页面资源的,比如index.html

from django.shortcuts import render

def index(request):

参数:请求对象 request,模板 html 文件,传给前台的资源

return render(request,'index.html')</code></pre>

index.html 文件

 


    主页


    

这是主页

配置完成后,访问127.0.0.1:8000/index/后显示为:

在 views.py文件中编写对应响应功能函数时,会自动出现模板文件

这是因为在 settings.py文件中已经把模板路径配置好了

TEMPLATES = [
    {
        # 如果使用第三方,可以在这个地方修改模板引擎
        'BACKEND': 'django.template.backends.django.DjangoTemplates',# 模板页面默认路径:项目根路径下的templates文件夹
        'DIRS': [os.path.join(BASE_DIR,# 允许所有app均拥有自己的模板文件夹
        'APP_DIRS': True,...
    },]

和上面的一样,首先在 views.py文件中配置响应函数

from django.shortcuts import render,redirect
# / 路径渲染index.html页面
def home(request):
    return render(request,'index.html')
# /index/ 路径重定向到 / 路径,达到渲染index.html页面
def index(request):
    return redirect('/')

响应的路由配置为

from django.conf.urls import url
from django.contrib import admin
# 导入应用视图
import app.views as app_view
urlpatterns = [
    url(r'^admin/',url(r'^index/$',app_view.index),url(r'^$',app_view.home),]

状态码显示为301说明发生了转跳,查看网络详细信息发现在index/中有个 location 字段,

该字段值为 /,说明转跳到了根目录下。

# 导入include功能,将url配置转移到指定应用内部的自身url配置文件
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
    url(r'^admin/',# 将url配置操作交给app_test自身的urls.py来进行操作
    # app-test/为app_test应用的总路径
    url(r'^app-test/',include('app_test.urls')),]

from django.conf.urls import url
from . import views
urlpatterns = [
    # 1.不要直接留空,直接留空 http://localhost:8000/app-test/* 均可以访问
    # 2.如果要配置index,访问的地址为 http://localhost:8000/app-test/index
    # 3.配置方式:r'^index/$',不要省略 / 符号
    # 4.正则是否以$标识结尾取决于该路径是否会有下一级路径
    url(r'^$',views.index),]

如果在两个应用中均有相同的模板页面假如为index.html

# 1.在应用templates文件夹下建立与应用同名的文件夹,eg:app_text下就建立app_text
# 2.将模板创建在与应用同名的模板文件夹下
# 3.修改指定应用下views.py处理请求的render模板指向
def index(request):
    # 模板指向:blog_app应用的templates下的blog_app文件夹中的index.html
    return render(request,'app_text/index.html')

假如页面需要一些静态资源,比如需要 css 样式、js 文件等,那么就需要在 settings 文件中配置好静态文件的路径。

# 静态文件地址 (CSS,Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
# 在项目根目录下新建static文件夹,静态资源均放在该文件夹中
# 增加STATICFILES_DIRS配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]
# 前端页面加载静态资源的路径:/static/... (...为具体在static文件夹中的路径)

# 如果要将项目根目录下source文件夹也作为静态资源路径
# STATICFILES_DIRS增加source配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),os.path.join(BASE_DIR,'source')
]
# 前端页面加载静态资源路径依旧不变,Django会自动索引:/static/... (...为具体在source文件夹中的路径)

# urls.py配置路由
url(r'test',app_view.test)

views.py设置响应函数

def test(request):
return HttpResponse('test')

问题:请求地址包含test均可以访问

http://127.0.0.1:8000/test => /test | /atest | /testa | /atesta | /test/a | /test/

<h3 id="开头">开头


<pre class="python"># urls.py配置路由
url(r'^test',app_view.test)

views.py设置响应函数

def test(request):
return HttpResponse('test')

问题:请求地址以test开头均可以访问

http://127.0.0.1:8000/test => /test | /testa | /test/a | /test/

<h3 id="结尾">结尾
<pre class="python"># urls.py配置路由
url(r'^test$',app_view.test)

views.py设置响应函数

def test(request):
return HttpResponse('test')

问题:只能一种方式访问

http://127.0.0.1:8000/test => /test

不能以 /test/ 访问

http://127.0.0.1:8000/test/

<h3 id="优化结尾">优化结尾
<pre class="python"># urls.py配置路由
url(r'^test/$',app_view.test)

views.py设置响应函数

def test(request):
return HttpResponse('test')

/test 和 /test/ 均可以访问

http://127.0.0.1:8000/test

http://127.0.0.1:8000/test/

问题:不能作为应用总路由

eg:app_test应用在项目urls.py

url(r'^app-test/',include('app_test.urls')) 末尾不能加$,因为作为应用总目录,是有下一级,如果用$标识结尾了,就代表不能有下一级路由

<h3 id="地址捕获">地址捕获
<pre class="python"># urls.py配置路由
url(r'^test/(\d+)/\d+/(\d+)/$',app_view.test)

对应请求路径

http://127.0.0.1:8000/test/1/22/333/

对应响应函数

def test(request,arg1,arg2):

arg1: str 1

# arg2: str 333
return HttpResponse('test')</code></pre>

<h3 id="小结">小结
<pre class="python"># 常规路由配置

r'^index/$'

r'^page/2/$'

应用路由配置

r'^app/'

根路由配置

r'^$'

路由配置均以 / 结尾

()中的字段会被请求响应函数捕获

限制响应函数捕获的变量名

(?P[0-9]+) 响应函数参数(requset,num)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path(&#39;authors/$&#39;, views.AuthorView.as_view()), re_path(&#39;book/(?P\d+)/$&#39;, vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = &#39;&#39;&#39; &lt;li&gt;&lt;s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 &gt; 依赖jQuery文件 实例--&gt;GET请求: 手动发送 &gt; 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render