don't know how to fix the error OSError at /images/create/[Errno 38] Function not implementedRequest Method:POST

here is the form code:


from django import forms

from .models import Image

from django.core.files.base import ContentFile

from django.utils.text import slugify

import requests

class ImageCreateForm(forms.ModelForm):

    class Meta:

        model = Image

        fields = ['title', 'url', 'description']

        widgets = {

            'url': forms.HiddenInput,

        }

    def clean_url(self):

        url = self.cleaned_data['url']

        valid_extensions = ['jpg', 'jpeg', 'png']

        extension = url.rsplit('.', 1)[1].lower()

        if extension not in valid_extensions:

            raise forms.ValidationError('The given URL does not ' \

                                        'match valid image extensions.')

        return url

    def save(self, force_insert=False,

                   force_update=False,

                   commit=True):

        image = super().save(commit=False)

        image_url = self.cleaned_data['url']

        name = slugify(image.title)

        extension = image_url.rsplit('.', 1)[1].lower()

        image_name = f'{name}.{extension}'

        # download image from the given URL

        response = requests.get(image_url)

        image.image.save(image_name,

                         ContentFile(response.content),

                         save=False)

        if commit:

            image.save()

        return image


here is the views.py:


from django.shortcuts import render, redirect

from django.contrib.auth.decorators import login_required

from django.contrib import messages

from django.shortcuts import get_object_or_404

from django.http import JsonResponse

from django.views.decorators.http import require_POST

from django.http import HttpResponse

from django.core.paginator import Paginator, EmptyPage, \

                                  PageNotAnInteger

from .forms import ImageCreateForm

from .models import Image

@login_required

def image_create(request):

    if request.method == 'POST':

        # form is sent

        form = ImageCreateForm(data=request.POST)

        if form.is_valid():

            # form data is valid

            cd = form.cleaned_data

            new_image = form.save(commit=False)

            # assign current user to the item

            new_image.user = request.user

            new_image.save()

            messages.success(request, 'Image added successfully')

            # redirect to new created image detail view

            return redirect(new_image.get_absolute_url())

    else:

        # build form with data provided by the bookmarklet via GET

        form = ImageCreateForm(data=request.GET)

    return render(request,

                  'images/image/create.html',

                  {'section': 'images',

                   'form': form})

def image_detail(request, id, slug):

    image = get_object_or_404(Image, id=id, slug=slug)

    return render(request,

                  'images/image/detail.html',

                  {'section': 'images',

                   'image': image})

@login_required

@require_POST

def image_like(request):

    image_id = request.POST.get('id')

    action = request.POST.get('action')

    if image_id and action:

        try:

            image = Image.objects.get(id=image_id)

            if action == 'like':

                image.users_like.add(request.user)

            else:

                image.users_like.remove(request.user)

            return JsonResponse({'status': 'ok'})

        except Image.DoesNotExist:

            pass

    return JsonResponse({'status': 'error'})

@login_required

def image_list(request):

    images = Image.objects.all()

    paginator = Paginator(images, 8)

    page = request.GET.get('page')

    images_only = request.GET.get('images_only')

    try:

        images = paginator.page(page)

    except PageNotAnInteger:

        # If page is not an integer deliver the first page

        images = paginator.page(1)

    except EmptyPage:

        if images_only:

            # If AJAX request and page out of range

            # return an empty page

            return HttpResponse('')

        # If page out of range return last page of results

        images = paginator.page(paginator.num_pages)

    if images_only:

        return render(request,

                      'images/image/list_images.html',

                      {'section': 'images',

                       'images': images})

    return render(request,

                  'images/image/list.html',

                   {'section': 'images',

                    'images': images})

here is the models code:




from django.db import models

from django.utils.text import slugify

from django.conf import settings

class Image(models.Model):

  user = models.ForeignKey(settings.AUTH_USER_MODEL,related_name='images_created',on_delete=models.CASCADE)

  title = models.CharField(max_length=200)

  slug = models.SlugField(max_length=200,blank=True)

  url = models.URLField(max_length=2000)

  image = models.ImageField(upload_to='images/%Y/%m/%d/')

  description = models.TextField(blank=True)

  created = models.DateField(auto_now_add=True)

  users_like = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='images_liked',blank=True)

  class Meta:

    indexes = [

    models.Index(fields=['-created']),

    ]

    ordering = ['-created']

  def __str__(self):

    return self.title

  

  def save(self, *args, **kwargs):

    if not self.slug:

      self.slug = slugify(self.title)

    super().save(*args, **kwargs)

HTML code:



{% extends "base.html" %}

{% block title %}Bookmark an image{% endblock %}

{% block content %}

  <h1>Bookmark an image</h1>

  <img src="{{ request.GET.url }}" class="image-preview">

  <form method="post">

    {{ form.as_p }}

    {% csrf_token %}

    <input type="submit" value="Bookmark it!">

  </form>

{% endblock %}



just in case I program on my phone (Acode). I run the code on Termux

1 Like

First, please don’t double-space your code, it’s extremely difficult to read on here that way.

Also, please post the complete traceback message. (Between the lines of three backticks, just like your code.)

Finally, what is your urls.py entry for the url /images/create/?

I’m also coding using Acode and termux

I have the same issue.

Traceback:

Environment:


Request Method: POST
Request URL: http://localhost:8000/admin/entries/image/add/?_to_field=id&_popup=1

Django Version: 3.2.18
Python Version: 3.11.4
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'entries']
Installed Middleware:
['middleware.HostValidationMiddleware',
 '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']



Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/storage.py", line 282, in _save
    locks.lock(fd, locks.LOCK_EX)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/locks.py", line 111, in lock
    fcntl.flock(_fd(f), flags)

During handling of the above exception ([Errno 38] Function not implemented), another exception occurred:
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1657, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1540, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1586, in _changeform_view
    self.save_model(request, new_object, form, not add)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1099, in save_model
    obj.save()
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 739, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 776, in save_base
    updated = self._save_table(
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 881, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 919, in _do_insert
    return manager._insert(
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/query.py", line 1270, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1415, in execute_sql
    for sql, params in self.as_sql():
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1358, in as_sql
    value_rows = [
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1359, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1359, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1310, in pre_save_val
    return field.pre_save(obj, add=True)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/fields/files.py", line 302, in pre_save
    file.save(file.name, file.file, save=False)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/fields/files.py", line 89, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/storage.py", line 54, in save
    name = self._save(name, content)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/storage.py", line 289, in _save
    locks.unlock(fd)
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/locks.py", line 117, in unlock
    fcntl.flock(_fd(f), fcntl.LOCK_UN)

Exception Type: OSError at /admin/entries/image/add/
Exception Value: [Errno 38] Function not implemented

The project (code) is on GitHub:

Clearly, something is not implemented. I am wondering whether it is not implemented in Termux/Android and I am screwed OR if a new version of Python or a library supports that for Termux/Android too and I should just update the said library.

Welcome @Brambor !
Django 3.2 does not support Python 3.11. See FAQ: Installation | Django documentation | Django for the list of supported Python versions.

Thanks for the quick response!

I did update Django, fixed some errors, but the error still remains.

New traceback:

Environment:


Request Method: POST
Request URL: http://localhost:8000/admin/entries/image/add/?_to_field=id&_popup=1

Django Version: 5.1.3
Python Version: 3.11.4
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'entries']
Installed Middleware:
['middleware.HostValidationMiddleware',
 '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']



Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/storage/filesystem.py", line 140, in _save
    locks.lock(fd, locks.LOCK_EX)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/locks.py", line 121, in lock
    fcntl.flock(_fd(f), flags)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^

During handling of the above exception ([Errno 38] Function not implemented), another exception occurred:
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 718, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 188, in _view_wrapper
    result = _process_exception(request, e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 186, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/views/decorators/cache.py", line 80, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/sites.py", line 241, in inner
    return view(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1961, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 48, in _wrapper
    return bound_method(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 188, in _view_wrapper
    result = _process_exception(request, e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/utils/decorators.py", line 186, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1820, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1871, in _changeform_view
    self.save_model(request, new_object, form, not add)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1294, in save_model
    obj.save()
    ^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 891, in save
    self.save_base(
    ^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 997, in save_base
    updated = self._save_table(
              
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 1160, in _save_table
    results = self._do_insert(
              
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/base.py", line 1201, in _do_insert
    return manager._insert(
           
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/query.py", line 1847, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1835, in execute_sql
    for sql, params in self.as_sql():
                       ^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1758, in as_sql
    value_rows = [
                 
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1759, in <listcomp>
    [
    ^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1760, in <listcomp>
    self.prepare_value(field, self.pre_save_val(field, obj))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1708, in pre_save_val
    return field.pre_save(obj, add=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/fields/files.py", line 338, in pre_save
    file.save(file.name, file.file, save=False)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/db/models/fields/files.py", line 99, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/storage/base.py", line 49, in save
    name = self._save(name, content)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/storage/filesystem.py", line 147, in _save
    locks.unlock(fd)
    ^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.11/site-packages/django/core/files/locks.py", line 127, in unlock
    fcntl.flock(_fd(f), fcntl.LOCK_UN)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Exception Type: OSError at /admin/entries/image/add/
Exception Value: [Errno 38] Function not implemented

The files on the GitHub are updated too.

I’m guessing it’s a limitation of termux and it’s just not going to work.

Your project works fine in a regular linux environment, so there’s nothing wrong with it.