Django相关

1. django视图函数处理URL的两种方式  FBV CBV

FBV :  一个url对应一个函数去处理。

CBV :  一个url对应一个类去处理。

先贴出 views的写法:

# FBVdef fbv(request):

    return HttpResponse(‘FBV‘)

# CBV
from django.views import View
class CBV(View):

    def dispatch(self, request, *args, **kwargs):
        print(‘扩展业务‘)
        ret = super(CBV, self).dispatch(request, *args, **kwargs)
        return  ret

    def get(self, request, *args, **kwargs):

        return HttpResponse(‘CBV.get‘)

    def post(self, request, *args, **kwargs):

        return HttpResponse(‘CBV.post‘)

URL的书写方式:

    # FBV 与 CBV
    url(r‘^fbv/‘, fbv),
    url(r‘^cbv/‘, CBV.as_view()),

用类去处理的时候,书写的类需要继承 View 类。并在类中定义get 方法  post方法。当请求方式是GET时,自动执行get方法中的代码,方式是POST时,执行post方法中的代码。

CBV 方式的执行过程:

当请求过来时,首先在URL中作匹配,匹配到后,自动执行类里面  dispatch(self, request, *args, **kwargs) 方法,如果方法在自己写的类中没有定义,则向其父类中找并执行方法。该方法会获得两个参数,一个是类型CBV,一个是请求的方式,然后根据 反射 查找 类中是否存在 对应请求方式的方法,(post get),func = hasattr(CBV, ‘get‘),如果存在 执行对应的方法。在自己写的get 或者post 方法中 均有 return HttpResponse(‘CBV.get‘),它的返回方式是先返回给dispatch ,再由dispatch返回给用户。因此,如果在自己的类中 定义dispatch 方法,首先要在方法中执行父类的dispatch 方法,因为是在父类的dispatch 方法 中寻找并执行get 或者post方法,如果不写,那么将上面也不行或者 你也可以字节写,如果你牛逼的话。然后还需要返回父类dispatch 的返回值  (return ret)。

2. Ajax CSRF 认证

CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性.

GET 请求不需要 CSRF 认证,POST 请求需要正确认证才能得到正确的返回结果。一般在POST表单中加入 {% csrf_token %}。

<form method="POST" action="/post-url/">
    {% csrf_token %}

    <input name=‘zqxt‘ value="自强学堂学习Django技术">
</form>

如果使用Ajax调用的时候,就要麻烦一些。需要注意以下几点:

  1. 在视图中使用 render (而不要使用 render_to_response)
  2. 使用 jQuery 的 ajax 或者 post 之前 加入这个 js 代码:http://www.ziqiangxuetang.com/media/django/csrf.js
jQuery(document).ajaxSend(function(event, xhr, settings) {
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != ‘‘) {
            var cookies = document.cookie.split(‘;‘);
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + ‘=‘)) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    function sameOrigin(url) {
        // url could be relative or scheme relative or absolute
        var host = document.location.host; // host + port
        var protocol = document.location.protocol;
        var sr_origin = ‘//‘ + host;
        var origin = protocol + sr_origin;
        // Allow absolute or scheme relative URLs to same origin
        return (url == origin || url.slice(0, origin.length + 1) == origin + ‘/‘) ||
            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + ‘/‘) ||
            // or any other URL that isn‘t scheme relative or absolute i.e relative.
            !(/^(\/\/|http:|https:).*/.test(url));
    }
    function safeMethod(method) {
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }

    if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
        xhr.setRequestHeader("X-CSRFToken", getCookie(‘csrftoken‘));
    }
});

或者 更为优雅简洁的代码(不能写在 .js 中,要直接写在模板文件中)

$.ajaxSetup({
    data: {csrfmiddlewaretoken: ‘{{ csrf_token }}‘ },
});

这样之后,就可以像原来一样的使用 jQuery.ajax() 和 jQuery.post()了。

第一种方式:将代码放到一个js文件中 如 csrf.js,在html中引入。

第二种方式:

<!DOCTYPE html>
<html>
<head>
<script src="/static/jquery.min.js"></script>

<script>
/*
      自强学堂 学习更多IT技术
  http://www.ziqiangxuetang.com
*/

$.ajaxSetup({
  data: {csrfmiddlewaretoken: ‘{{ csrf_token }}‘ },
});

$.post(‘{% url "exam2014" %}‘, {‘drugs‘: drugs}, function(ret){
      $(‘#result‘).html(ret);
  })

</script>
</head>

<body>

<p>请选择两个药名:</p>
<form>
{% for drug in drugs %}
    <input type="checkbox" name="drug" value="{{ drug.id }}">{{ drug.name }}<br>
{% endfor %}
<br><input type="button" onclick="select_drug()" value="Submit"><br>
</form>

<div id="result"></div>

</body>

</html>

 3. 数据库的配置

  1. django默认支持sqlite,mysql, oracle,postgresql数据库。

  <1> sqlite

django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3

 <2> mysql

引擎名称:django.db.backends.mysql

  2. 在django的项目中会默认使用sqlite数据库,如果我们想要更改数据库,需要修改如下:

DATABASES = {

    ‘default‘: {

        ‘ENGINE‘: ‘django.db.backends.mysql‘, 

        ‘NAME‘: ‘books‘,    #你的数据库名称

        ‘USER‘: ‘root‘,   #你的数据库用户名

        ‘PASSWORD‘: ‘‘, #你的数据库密码

        ‘HOST‘: ‘‘, #你的数据库主机,留空默认为localhost

        ‘PORT‘: ‘3306‘, #你的数据库端口

    }

}

注意:

NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建

USER和PASSWORD分别是数据库的用户名和密码。

设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。

然后,启动项目,会报错:no module named MySQLdb

这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL

所以,我们只需要找到项目名文件下的__init__,在里面写入:

import pymysql
pymysql.install_as_MySQLdb()

问题解决!

   <4>  模型常用的字段类型参数

<1> CharField
        #字符串字段, 用于较短的字符串.
        #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.

<2> IntegerField
       #用于保存一个整数.

<3> FloatField
        # 一个浮点数. 必须 提供两个参数:
        #
        # 参数    描述
        # max_digits    总位数(不包括小数点和符号)
        # decimal_places    小数位数
                # 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
                #
                # models.FloatField(..., max_digits=5, decimal_places=2)
                # 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
                #
                # models.FloatField(..., max_digits=19, decimal_places=10)
                # admin 用一个文本框(<input type="text">)表示该字段保存的数据.

<4> AutoField
        # 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
        # 自定义一个主键:my_id=models.AutoField(primary_key=True)
        # 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.

<5> BooleanField
        # A true/false field. admin 用 checkbox 来表示此类字段.

<6> TextField
        # 一个容量很大的文本字段.
        # admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).

<7> EmailField
        # 一个带有检查Email合法性的 CharField,不接受 maxlength 参数.

<8> DateField
        # 一个日期字段. 共有下列额外的可选参数:
        # Argument    描述
        # auto_now    当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
        # auto_now_add    当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
        #(仅仅在admin中有意义...)

<9> DateTimeField
        #  一个日期时间字段. 类似 DateField 支持同样的附加选项.

<10> ImageField
        # 类似 FileField, 不过要校验上传对象是否是一个合法图片.#它有两个可选参数:height_field和width_field,
        # 如果提供这两个参数,则图片将按提供的高度和宽度规格保存.
<11> FileField
     # 一个文件上传字段.
     #要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime #formatting,
     #该格式将被上载文件的 date/time
     #替换(so that uploaded files don‘t fill up the given directory).
     # admin 用一个<input type="file">部件表示该字段保存的数据(一个文件上传部件) .

     #注意:在一个 model 中使用 FileField 或 ImageField 需要以下步骤:
            #(1)在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件.
            # (出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL 作为该目录的公共 URL. 要确保该目录对
            #  WEB服务器用户帐号是可写的.
            #(2) 在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django
            # 使用 MEDIA_ROOT 的哪个子目录保存上传文件.你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT).
            # 出于习惯你一定很想使用 Django 提供的 get_<#fieldname>_url 函数.举例来说,如果你的 ImageField
            # 叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }} 这样的方式得到图像的绝对路径.

<12> URLField
      # 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在( 即URL是否被有效装入且
      # 没有返回404响应).
      # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)

<13> NullBooleanField
       # 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField 加 null=True 选项
       # admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" ) 来表示这种字段数据.

<14> SlugField
       # "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.#它们通常用于URLs
       # 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50.  #在
       # 以前的 Django 版本,没有任何办法改变50 这个长度.
       # 这暗示了 db_index=True.
       # 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-#populate
       # the slug, via JavaScript,in the object‘s admin form: models.SlugField
       # (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields.

<13> XMLField
        #一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema #的文件系统路径.

<14> FilePathField
        # 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
        # 参数    描述
        # path    必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目.
        # Example: "/home/images".
        # match    可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名.
        # 注意这个正则表达式只会应用到 base filename 而不是
        # 路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
        # recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
        # 这三个参数可以同时使用.
        # match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
        # FilePathField(path="/home/images", match="foo.*", recursive=True)
        # ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif

<15> IPAddressField
        # 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").
<16># CommaSeparatedIntegerField
        # 用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数.

   <5>  Field重要参数

    <1> null : 数据库中字段是否可以为空

    <2> blank: django的 Admin 中添加数据时是否可允许空值

    <3> default:设定缺省值

    <4> editable:如果为假,admin模式下将不能改写。缺省为真

    <5> primary_key:设置主键,如果没有设置django创建表时会自动加上:
        id = meta.AutoField(‘ID‘, primary_key=True)
        primary_key=True implies blank=False, null=False and unique=True. Only one
        primary key is allowed on an object.

    <6> unique:数据唯一

    <7> verbose_name  Admin中字段的显示名称

    <8> validator_list:有效性检查。非有效产生 django.core.validators.ValidationError 错误

    <9> db_column,db_index 如果为真将为此字段创建索引

    <10>choices:一个用来选择值的2维元组。第一个值是实际存储的值,第二个用来方便进行选择。
                如SEX_CHOICES= (( ‘F’,‘Female’),(‘M’,‘Male’),)
                gender = models.CharField(max_length=2,choices = SEX_CHOICES)

4. 静态文件配置

首先,我们配置静态文件,要在setting.py里面加入如下几行代码: settings.py

STATIC_URL = ‘/static/‘
STATICFILES_DIRS = (os.path.join(BASE_DIR, ‘static‘),)

静态文件的一般安放位置有两种:

1.一种就是在每个app里面新建一个static文件夹,将静态文件放到里面,在加载静态文件时,比如要在模板中用到静态文件,django会自动在每个app里面搜索static文件夹(所以,不要把文件夹的名字写错哦, 否则django就找不到你的文件夹了)。

2.另一种,就是在所有的app文件外面,建立一个公共的文件夹, 因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为最后所有的静态文件都会在STATIC_ROOT里面存在) 那现在的问题是如何让django知道你把一些静态文件放到app以外的公共文件夹中呢,那就需要置

STATICFILES_DIRS = (

  os.path.join(BASE_DIR, ‘common_static‘),

)

STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找(注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)。

2 . 引入方式:.

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="/static/css/cls.css" rel="stylesheet" type="text/css">
</head>

或者

<head>
    <meta charset="UTF-8">
    <title>Title</title>
      {% load staticfiles %}
     <link href="{% static ‘css/cls.css‘ %}" rel="stylesheet" type="text/css">
</head>

参考文档:http://blog.csdn.net/jj546630576/article/details/78606531

5. UrL路由两种方式

url(r‘^xxx/(?P<uid>[0-9]+)$‘, jiaoshi.xxx, name=‘sss‘),
url(r‘^ccc/‘, jiaoshi.ccc),
 <a href="{% url ‘sss‘ 6 %}">211212</a>
    <a href="/ccc?tn={{ 6 }}">33333</a>
def xxx(request, uid):
    print(uid)

    return HttpResponse(‘OK‘)

def ccc(request):
    # print()
    print(request.GET.get(‘tn‘))

    return HttpResponse(‘OK‘)

  

原文地址:https://www.cnblogs.com/liyqiang/p/8487310.html

时间: 2024-10-17 05:51:32

Django相关的相关文章

django 相关问题集锦

在使用django开发的过程中,会遇到一些问题,为了以后的方便,持续积累相关问题以便查找. Q:django的modle怎么设定唯一值? A:unique=True

Django相关配置(包括数据库、templates、static等)信息—Django2.0

1.项目路径配置 2.调试阶段DEBUG =Ture,在调试中会自动检测代码是否发生更改,项目上线后,改为False,否则会泄露系统相关信息 3静态资源配置 # https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/' 上述配置信息将静态资源存放在static中,而文件夹static只能存放于App中.创建app为index,在index中添加文件夹static, 存放静态文件.如果将sta

django 相关问题

和数据库的连接 session的实现 django app开发步骤 python环境准备 数据库安装 model定义 url mapping定义 view定义 template定义 如何查看数据库里的数据 如何利用django shell调试

django相关网站

记录django的学习笔记:http://www.cnblogs.com/qwj-sysu/tag/django/ uwsgi的文档:http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html beautifulsoup的中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html zip函数的一些例子:http://www.jianshu.com/p/fbf71e

Django 相关知识

布局:    header    body    footer    $(#).hide()    补充:    cursor:pointer; 针对A标签,鼠标变小手    A标签下划线消失:text-decoration:none    z-index:值,图层分布    圆角:border-radius:50%    .header.menu a:hover{}        鼠标点中变颜色    例子:    <!DOCTYPE html><html lang="en&

django相关字段解释(slug)

1.slug:用于生成一个有意义(valid, meaninful)URL 参考(http://stackoverflow.com/questions/427102/what-is-a-slug-in-django) 比如:http://stackoverflow.com/questions/427102/what-is-a-slug-in-django 后面的“what-is-a-slug-in-django”就是经过slug后的产物 如何使用: 需要使用slugify功能:from djan

日天老师的django相关博客

Yuan先生的博客网址 1 Web应用 https://www.cnblogs.com/yuanchenqi/articles/8869302.html 2 http协议 https://www.cnblogs.com/yuanchenqi/articles/8875623.html 3 web框架 https://www.cnblogs.com/yuanchenqi/articles/8946917.html 4 Django简介 https://www.cnblogs.com/yuanche

整合django和bootstrap框架

由于bootstrap就是一堆css和js以及字体文件,并且属于静态资源,所以我们只需要配置好django的访问路径,能够让template里面的代码访问到bootstrap相关的文件即可. 第一步: 下载bootstrap文件,http://v3.bootcss.com/getting-started/ 然后将本件解压以后,放到django框架的目录中. 我的放置位置如下. 如果我们的django项目叫做python_web,项目里面有个应用叫做blog. 那么我们需要在python_web下

mac下安装django

参考文章 一:写在前面 DJango系列学习笔记主要以学习为主,并没有抱着写成一个产品做市场的心态.所以很多框架配置博主都是本着简单至上的原则,大家如果想在这里找到追求 稳定.高性能的DJango相关内容,恐怕得失望了.但是我认为如果你是个和我一样的新手,不妨我们一起学习,一起进步. 二:关于Python 既然是Python的Web Framework,那当然得安装Python啦.不过Mac下默认安装了最稳定的Python,所以我们不用担心.如果你是Win下的同学,可以参考<安装Python>