Django项目开发通解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32740675/article/details/80021571

这学期的结业作业”学生信息服务系统”,是这学期计划中的一个web程序,然而由于是第一次接触web端编程,跟着官网范例,网上教程以及图书跟着写代码,总感觉越到后面,就越是难以更改,代码结构就越不相同。虽然代码量没多少,但我不喜欢在老代码上有大规模的整改,我认为这样可能会变成人不人鬼不鬼的代码,我当然也知道要写一个项目之前,对于框架,语言之类的得先练练手,实现几个小demo后再开始。但是时间有限,我还是想尽早能实现该项目的一个雏形。在对django又有了进一步的小小进步后,我打算把django框架下的项目开发步骤写一篇博客,作为个人开发行为经验,记录在网络上。

文章前提:
- 本文所写皆是个人经验,如有错误或不好的地方,希望能给出指正
- 作者使用的工具版本是py3.5,django2.0,数据库使用的mysql 5.7.18,使用了PyCharm IDE.

1.准备工作

1.1项目环境

在开发工程之前,肯定得先准备好环境、工具、资源等,几乎所有使用了框架的长期运营的项目都一样,得为自己创建一个开发虚拟环境1,这样便于部署在其它服务器上,也不会和其它项目发生冲突。

1.2创建项目

使用PyCharm创建Django项目目录2,或使用命令创建项目目录:

django-admin.py startproject ProjectName

1.3设置资源目录

每个网站都会有资源文件(部分练手的除外),在这里就可以准备好资源文件的位置了,具体步骤为:

  1. 在项目目录下创建static,templates文件夹
  2. 再在static文件夹中建立css,js,image子文件夹,如果有多个app再在各子文件夹中建立每个app的文件夹,用于区分
  3. 如果有多个app也需在templates中建立app子文件夹,用以区分

[注]动态文件(如用以用户上传下载的文件)在djang中叫Media,不需要手动建立文件夹,只需要在程序中指定,运行时程序会自动创建该文件夹

1.4更改全局设置

建立完以上需要的文件夹后,再在setting.py中设置指定该位置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],   #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',
            ],
        },
    },
]
#模版位置和相关设置

STATICFILES_DIRS = (
    ('css', os.path.join(BASE_DIR, 'static/css').replace('\\', '/')),
    ('image', os.path.join(BASE_DIR, 'static/image').replace('\\', '/')),
    ('js', os.path.join(BASE_DIR, 'static/js').replace('\\', '/')),
)
STATIC_URL = '/static/'
#静态文件地址和url

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')  
MEDIA_URL = 'site_media/'  
#设置用户上传路径,FileField, ImageField里面的upload_to的相对路径就是相对于MEDIA_ROOT
#可以通过 hostname/site_media/...  访问MEDIA_ROOT中的内容

除了设置以上文件位置以外,还有以下常用设置:

LANGUAGE_CODE = 'zh-hans'
#管理界面更改为中文
TIME_ZONE = 'Asia/Shanghai'
#更改为中国时钟

LOGIN_URL = '/login/'   
#如果使用登录验证装饰器则需要指定登录url,适用于需要登录才能处理的页面比较多多的情况


"""
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key
SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径(默认保存在数据库中)
SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名(默认保存在数据库中)
#session可以保存在文件、缓存、数据库中
SESSION_COOKIE_SECURE = False  # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存(默认)
"""

################################################################# GET####
############ SQL语句相关,运行的sql语句打印在服务端上###########

LOGGING = {
 'version': 1,
 'disable_existing_loggers': False,
 'handlers': {
 'console':{
  'level':'DEBUG',
  'class':'logging.StreamHandler',
 },
 },
 'loggers': {
 'django.db.backends': {
  'handlers': ['console'],
  'propagate': True,
  'level':'DEBUG',
 },
 }
}
#############################
### 设置使用的数据库,如果不设置则默认使用sqlite3
DATABASES = {
    'default': {
        'ENGINE':'django.db.backends.xxxx',  #如'django.db.backends.mysql'
        'NAME': 'databasename',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS':{
            'init_command':"SET sql_mode='STRICT_TRANS_TABLES'" #严格模式
        }
    }
}


# INSTALLED_APPS 中添加app
# MIDDLEWARE     中添加中间件
# DEBUG = True    # 上线时更改为False

顺便介绍下session的用法

request.session.set_expiry(value)
如果value是个整数, session会在这些秒后失效
如果value是个datatime或timedelta,session就会在这个时间后失效
如果value是0,用户关闭浏览器session就会失效
如果value是None,session会依赖全局session失效策略

request.session.delete("session_key")
删除当前用户的所有session数据

request.session.clear()
清除所有session

request.session['k1']
request.session.get('k1',None)
request.session['k1'] =123
不存则设置,存在则更新

request.session.setdefault('k1',123)
存在则不设置

开始编码

App篇

前戏结束后,就能正式开始工作了,首先第一件事肯定是建立所有需要的APP
使用命令:

python manage.py startapp appname 

之后,App篇的编码一般步骤如下:


 1. 将app添加进setting.py中的INSTALLED_APPS中
 2. 设计并编写app的models.py
 3. 迁移数据 python manage.py makemigrations appname 
 4. 生成数据表 python manage.py migrate appname 
 5. 将该 app 的 models 中的内容注册到该 app 目录下的 admin.py6. 设计并编写app的views.py
 7. 建立urls.py,仿照项目根目录中urls.py的格式,配置该 app 中的所有视图的 url
 8. 将 app 的 urls.py 包含进项目根目录中的urls.py

第四、五步具体做法可以参考我博客中之前的 模型篇
关于django的ORM使用可以参考:http://www.cnblogs.com/xubohua/p/8651959.html

template篇

参考模版篇

Django项目开发进阶指导

开发过初级项目后,考虑大点的项目时,就会逐渐发现,代码不够”优雅”、重用率不高,以及安全性问题等,这里仅记录了我所遇到过的一些情况,如果有补充,欢迎指教:

安全问题

在Django开发中,根据教程,以及官网的要求开发,恐怕第一个遇到的和代码逻辑无关,补充安全性漏洞的代码就是html模版的表单中所遇到的{% csrf_token %}了吧
开始不了解这个的意思,没去管他,导致我的视图函数老是运行异常,后来才了解到,这是针对 跨域攻击 的一种手段,在视图函数中返回响应时必须用return render(request, 'login.html')这样的形式才能让django自动帮我们完成csrf的验证(当然,也可以自己解决csrf验证问题,或者暂时关闭csrf)
可见,web程序的安全性问题的重要性,所以,这里列举出所需要留意,解决的安全性问题,以及常用解决方案:

 CSRF(Cross-site request forgery)跨站请求伪造     (为以cookie验证用户的补充)
 解决方案:在表单中增加
 {% csrf_token %} -----> 转换成一个hidden属性的input标签
 {{ csrf_token }} -----> 直接获取csrf的随机字符串
 要通过这个验证,视图函数中使用render返回
 ajax

XSS攻击:跨站脚本攻击                              (仿照的sql注入)
解决方案:使用js的xss攻击过滤框架...

部署前安全性检查:
解决方案:manage.py check –deploy  django自带的安全性检查命令

视图

除了开始最常用的视图函数以外,django早从1.3起就有 class view了
需要了解的知识点如下:

视图函数
基于类的视图
通用视图
基于类的视图混合

模版

需要了解的知识点如下:

模版中的符号逻辑
模版继承
...

模型

需要了解的知识点如下:

Djano版ORM的基本使用
自定义字段
原生SQL的使用
...

URL

需要了解的知识点如下:

path的使用
path_re的使用
...

管理

需要了解的知识点如下:

admin的定制
git上另外django管理型框架的使用
...

参考: http://blog.51cto.com/zengestudy/1942614


  1. 短期运营项目以及简单的项目或实验、作业什么的可以不需要建立虚拟环境,
  2. PyCharm创建项目可以直接顺便创建项目环境,包管理也不错,值得使用

猜你喜欢

转载自blog.csdn.net/qq_32740675/article/details/80021571